Загрузить\Выгрузить файл(ы) на FTP в пассивном режиме - Visual Basic .NET
Формулировка задачи:
Всем привет!
Столкнулся с проблемой, обмена с FTP (на IIS) с помощью Net.FtpWebRequest в пассивном режиме.
При попытке загрузить список каталогов, получить или отправить на фтп данные сообщает об ошибке: 227 Entering Passive Mode (ххх,ххх,ххх,ххх,224,18).
Использование свойства UsePassive = true, также не помогает, ошибка повторяется.
Если свойство установить в UsePassive = false, сообщит о следующей ошибке: "500 PORT/EPRT (Active Mode/Extended Active Mode) is not supported. Use PASV/EPSV instead of this"
Примеры кода перепробовал несколько, в т.ч. и из готовых решений, ошибка одна и таже.
Поиск по форуму, да и гуглу особо результата не дал.
Да я понимаю, что при пассивном подключении нужно получить порт от сервера, но вот как его получить и подключиться к серверу никак не пойму. Пароли и прочее все верно. Подключение через браузер и тоталкомандер успешные.
Вот один из примеров кода на котором я тестировал (значение свойства UsePassive = true, дописывал самостоятельно):
Пожалуйста, помоги разобраться и как осуществить подключение к серверу в пассивном режиме, может даже пример кода у кого завалялся.
Заранее спасибо!
Листинг программы
- 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
- _FtpWebRequest.UsePassive = True
- 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.CopyT(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 FTP("server", "pass")
- ftp.UploadFile("localfile", "hostfile")
- ftp.DownloadFile("localfile", "hostfile")
- Dim directory As List(Of String) = ftp.GetDirectory("ftp://hostdir/")
- ListBox1.Items.Clear()
- For Each item As String In directory
- ListBox1.Items.Add(item)
- Next
Решение задачи: «Загрузить\Выгрузить файл(ы) на FTP в пассивном режиме»
textual
Листинг программы
- Dim ftp As New FTP("login", "password")
- Dim directory As List(Of String) = ftp.GetDirectory("ftp://site.ru/")
- ListBox1.Items.Clear()
- For Each item As String In directory
- ListBox1.Items.Add(item)
- Next
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д