Загрузка файла через FTP - ошибка сервера вернулась (550) Файл недоступен, файл не найден

2

Я пытаюсь загрузить файл через FTP с моего локального компьютера на FTP-сервер, который также находится на моем локальном компьютере. У меня есть этот суб, который я вызываю:

    Public Sub UploadFTPFile(ByVal ftpservername, ByVal fullfilepath, ByVal filename, ByVal username, ByVal password)

    Dim clsRequest As System.Net.FtpWebRequest = _
    DirectCast(System.Net.WebRequest.Create("ftp://" & ftpservername & "/" & filename), System.Net.FtpWebRequest)
    clsRequest.Credentials = New System.Net.NetworkCredential(username, password)
    clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile

    clsRequest.KeepAlive = False

    ' read in file...
    Dim bFile() As Byte = System.IO.File.ReadAllBytes(fullfilepath)

    ' upload file...
    Dim clsStream As System.IO.Stream = _
        clsRequest.GetRequestStream()
    clsStream.Write(bFile, 0, bFile.Length)
    clsStream.Close()
    clsStream.Dispose()
End Sub

При вызове sub, я делаю это следующим образом:

UploadFTPFile("192.168.1.3/Temp", selectedSoundFileLong, OpenFileDialog.SafeFileName, "", "")

Другими словами, в Sub это строка:

DirectCast(System.Net.WebRequest.Create("ftp://" & ftpservername & "/" & filename), System.Net.FtpWebRequest)

создает следующее:

    DirectCast(System.Net.WebRequest.Create("ftp://192.168.1.3/Temp/test.mp3"), System.Net.FtpWebRequest)

И на этой строке в sub:

        Dim clsStream As System.IO.Stream = _
        clsRequest.GetRequestStream()

Эта ошибка возникает:

The remote server returned an error: (550) File unavailable

Что может быть причиной этого? Я запускаю FTP-сервер с использованием FTP-сервера Golder, который является бесплатным. Я думаю, что он правильно настроен, потому что подключение к FTP-серверу с использованием той же строки, что и выше, с помощью проводника Windows отлично работает.

Теги:
ftp
ftpwebrequest

3 ответа

2
Лучший ответ

Вы уверены, что в строке webRequest нет лишнего пробела? Я считаю, что вы получили бы эту ошибку, если бы строка оказалась похожей на ftp://192.168.1.3/ Temp/test.mp3" Также убедитесь, что у вас есть правильные привилегии для записи на этот сервер. Кроме того, убедитесь, что файл - test.mp3, а не test.MP3.

  • 0
    У меня не было ny пробелов в имени файла вообще. Привилегии, чтобы написать серверу было решением :)
2

Попробуйте перевернуть свойство UsePassive. Управление и использование данных разные порты в FTP, возможно, вы проходите через порт управления, но каким-то образом заблокируете порт данных.

  • 0
    Спасибо, я попробовал это, и мне показалось, что все получилось :) Хотя это не сработало само по себе, мне нужно было настроить некоторые параметры на FTP-сервере, чтобы разрешить входящий трафик. Работает сейчас, спасибо! :)
  • 0
    Кстати, есть идеи, как я могу показать прогресс-бар?
0

550 - это код ошибки подключения System.Net.FtpWebRequest.

Также вы не правильно создали свой FTP-сервер, проверяя мой класс FTP: его довольно просто.

Public Class FTP
        '-------------------------[BroCode]--------------------------
        '----------------------------FTP-----------------------------
        Private _credentials As System.Net.NetworkCredential
        Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
            setCredentials(_FTPUser, _FTPPass)
        End Sub
        Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
            Dim _FileInfo As New System.IO.FileInfo(_FileName)
            Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
            _FtpWebRequest.Credentials = _credentials
            _FtpWebRequest.KeepAlive = False
            _FtpWebRequest.Timeout = 20000
            _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
            _FtpWebRequest.UseBinary = True
            _FtpWebRequest.ContentLength = _FileInfo.Length
            Dim buffLength As Integer = 2048
            Dim buff(buffLength - 1) As Byte
            Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
            Try
                Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
                Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
                Do While contentLen <> 0
                    _Stream.Write(buff, 0, contentLen)
                    contentLen = _FileStream.Read(buff, 0, buffLength)
                Loop
                _Stream.Close()
                _Stream.Dispose()
                _FileStream.Close()
                _FileStream.Dispose()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
        Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
            Try
                Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
                _request.KeepAlive = False
                _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
                _request.Credentials = _credentials
                Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
                Dim responseStream As System.IO.Stream = _response.GetResponseStream()
                Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
                responseStream.CopyTo(fs)
                responseStream.Close()
                _response.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
        Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
            Dim ret As New List(Of String)
            Try
                Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
                _request.KeepAlive = False
                _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
                _request.Credentials = _credentials
                Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
                Dim responseStream As System.IO.Stream = _response.GetResponseStream()
                Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
                Dim FileData As String = _reader.ReadToEnd
                Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
                For Each l As String In Lines
                    ret.Add(l)
                Next
                _reader.Close()
                _response.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
            Return ret
        End Function

        Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
            _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
        End Sub
    End Class

Для инициализации:

Dim ftp As New FORM.FTP("username", "password")

ftp.UploadFile("c:\file.jpeg", "ftp://domain/file.jpeg")

ftp.DownloadFile("c:\file.jpeg", "ftp://ftp://domain/file.jpeg")

Dim directory As List(Of String) = ftp.GetDirectory("ftp://ftp.domain.net/")
        ListBox1.Items.Clear()
        For Each item As String In directory
            ListBox1.Items.Add(item)
        Next

Ещё вопросы

Сообщество Overcoder
Наверх
Меню