Загрузить\Выгрузить файл(ы) на 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, дописывал самостоятельно):
Листинг программы
  1. Public Class FTP
  2. '-------------------------[BroCode]--------------------------
  3. '----------------------------FTP-----------------------------
  4. Private _credentials As System.Net.NetworkCredential
  5. Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
  6. setCredentials(_FTPUser, _FTPPass)
  7. End Sub
  8. Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
  9. Dim _FileInfo As New System.IO.FileInfo(_FileName)
  10. Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
  11. _FtpWebRequest.Credentials = _credentials
  12. _FtpWebRequest.KeepAlive = False
  13. _FtpWebRequest.Timeout = 20000
  14. _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
  15. _FtpWebRequest.UseBinary = True
  16. _FtpWebRequest.ContentLength = _FileInfo.Length
  17. _FtpWebRequest.UsePassive = True
  18. Dim buffLength As Integer = 2048
  19. Dim buff(buffLength - 1) As Byte
  20. Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
  21. Try
  22. Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
  23. Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
  24. Do While contentLen <> 0
  25. _Stream.Write(buff, 0, contentLen)
  26. contentLen = _FileStream.Read(buff, 0, buffLength)
  27. Loop
  28. _Stream.Close()
  29. _Stream.Dispose()
  30. _FileStream.Close()
  31. _FileStream.Dispose()
  32. Catch ex As Exception
  33. MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
  34. End Try
  35. End Sub
  36. Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
  37. Try
  38. Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
  39. _request.KeepAlive = False
  40. _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
  41. _request.Credentials = _credentials
  42. Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
  43. Dim responseStream As System.IO.Stream = _response.GetResponseStream()
  44. Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
  45. 'responseStream.CopyT(fs)
  46. responseStream.Close()
  47. _response.Close()
  48. Catch ex As Exception
  49. MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
  50. End Try
  51. End Sub
  52. Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
  53. Dim ret As New List(Of String)
  54. Try
  55. Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
  56. _request.KeepAlive = False
  57. _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
  58. _request.Credentials = _credentials
  59. Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
  60. Dim responseStream As System.IO.Stream = _response.GetResponseStream()
  61. Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
  62. Dim FileData As String = _reader.ReadToEnd
  63. Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
  64. For Each l As String In Lines
  65. ret.Add(l)
  66. Next
  67. _reader.Close()
  68. _response.Close()
  69. Catch ex As Exception
  70. MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
  71. End Try
  72. Return ret
  73. End Function
  74. Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
  75. _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
  76. End Sub
  77. End Class Dim ftp As New FTP("server", "pass")
  78. ftp.UploadFile("localfile", "hostfile")
  79. ftp.DownloadFile("localfile", "hostfile")
  80. Dim directory As List(Of String) = ftp.GetDirectory("ftp://hostdir/")
  81. ListBox1.Items.Clear()
  82. For Each item As String In directory
  83. ListBox1.Items.Add(item)
  84. Next
Пожалуйста, помоги разобраться и как осуществить подключение к серверу в пассивном режиме, может даже пример кода у кого завалялся. Заранее спасибо!

Решение задачи: «Загрузить\Выгрузить файл(ы) на FTP в пассивном режиме»

textual
Листинг программы
  1. Dim ftp As New FTP("login", "password")
  2.  Dim directory As List(Of String) = ftp.GetDirectory("ftp://site.ru/")
  3.         ListBox1.Items.Clear()
  4.         For Each item As String In directory
  5.             ListBox1.Items.Add(item)
  6.         Next

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы