Страница: 1 |
|
Вопрос: .Net и ftp протокол
|
Добавлено: 14.02.13 07:07
|
|
Автор вопроса: DrKillJoy
|
Доброго времени суток!
Имеется ftp сервер с которого нужно скачать файл. Задача вроде бы простая, но рабочий ПК "общается" через прокси. И вот это стало для меня непробиваемой стеной.
Вот код функции скачивания файла:
Private Sub Download(ByVal filePath As String, ByVal filename As String)
Dim ftpServerIP As String = "адрес ftp сервера"
Dim ftpUserID As String = "login"
Dim ftpPassword As String = "pass"
Dim fileInf As New IO.FileInfo(filename)
Dim uri As String = "ftp://" + ftpServerIP + "/" + fileInf.Name
Dim reqFTP As FtpWebRequest
Try
Dim proxyObject As New WebProxy("ftp://192.168.1.1:3127")
Dim outputStream As FileStream = New FileStream(filePath + "\\" + filename, FileMode.Create)
reqFTP = FtpWebRequest.Create(New Uri("ftp://" + ftpServerIP + "/" + filename))
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
reqFTP.UseBinary = True
reqFTP.Credentials = New NetworkCredential(ftpUserID, ftpPassword)
reqFTP.Proxy = proxyObject
Dim response As FtpWebResponse = reqFTP.GetResponse()
'Stream(ftpStream = response.GetResponseStream())
Dim ftpStream As IO.Stream = reqFTP.GetRequestStream()
Dim cl As Long = response.ContentLength
'Int(bufferSize = 2048)
'Int(readCount)
'Dim buffer As Byte()
Dim bufferSize As Integer = 2048
Dim buff(bufferSize) As Byte
Dim readCount As Integer
readCount = ftpStream.Read(buff, 0, bufferSize)
While readCount > 0
outputStream.Write(buff, 0, readCount)
readCount = ftpStream.Read(buff, 0, bufferSize)
End While
ftpStream.Close()
outputStream.Close()
response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Download Error")
End Try
End Sub
При использовании http прокси, получаю ошибку, что сервер нарушил протокол.
А при использовании ftp прокси, получаю ошибку, что "класс ServicePointManager не поддерживает прокси со схемой FTP."
Любой совет, любая идея будет полезна! А то я уже второй день мучаюсь...
Ответить
|
Номер ответа: 5 Автор ответа:
DrKillJoy
 
Вопросов: 10 Ответов: 18
|
Профиль | | #5
|
Добавлено: 17.02.13 16:49
|
тут надо логин/пароль не для фтп, а для прокси. А у него вроде нет, логина и пароля. Так как FarManager нормально подключается без них...
либо, как вариант, на проксе закрыт стандартный фтпшный порт.. это надо решать с админом прокси А что это даст? И можно ли через http прокси работать с ftp?
Не удивлюсь если товарищ через обычный HTTP прокси пытается работать по FTP. Нет. Это ведь ftp прокси: - Dim proxyObject As New WebProxy("ftp://192.168.1.1:3127")
Я уже замучился воевать, с этим прокси...( У кого, еще есть идеи?
Ответить
|
Номер ответа: 6 Автор ответа:
DrKillJoy
 
Вопросов: 10 Ответов: 18
|
Профиль | | #6
|
Добавлено: 19.02.13 10:19
|
Я наконец разобрался со своей проблемой. Большое спасибо, откликнувшимся! Проблема, увы, была не в коде. Просто на сервере была выставлена такая политика безопасности. Пришлось с админом договариваться.
- Imports System.Text
- Imports System.Net
- Imports System.IO
- Public Class FTPClient
- Private UserID As String
- Private Password As String
- Public DownloadFileSize As Integer
- Public DownloadSize As Integer
-
- Public Sub New(ByVal UserID As String, ByVal Password As String)
- Me.UserID = UserID
- Me.Password = Password
- End Sub
-
- Public Sub uploadFile(ByVal URI As String, ByVal UploadFileName As String, ByVal LocalPath As String, ByVal LocalFileName As String, Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "")
- Dim completePath = LocalPath + "/" + LocalFileName
- Dim fileInf As FileInfo = New FileInfo(completePath)
-
- If UploadFileName = "" Then
- UploadFileName = LocalFileName
- End If
-
- If FTPUserID = "" Then
- FTPUserID = Me.UserID
- End If
-
- If FTPPassword = "" Then
- FTPPassword = Me.Password
- End If
-
- Dim MyURI As String = URI + "/" + UploadFileName
-
-
-
- Dim reqFTP As FtpWebRequest
-
-
- Dim buffLength As Integer = 2048
- Dim buff(buffLength) As Byte
- Dim contentLen As Integer
-
- Dim response As FtpWebResponse = Nothing
-
- Dim fs As FileStream = fileInf.OpenRead()
- Dim strm As Stream = Nothing
-
- Try
- reqFTP = CType(FtpWebRequest.Create(New Uri(MyURI)), FtpWebRequest)
- reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
- reqFTP.KeepAlive = False
- reqFTP.Method = WebRequestMethods.Ftp.UploadFile
- reqFTP.UseBinary = True
- reqFTP.ContentLength = fileInf.Length
- reqFTP.UsePassive = True
-
- response = CType(reqFTP.GetResponse(), FtpWebResponse)
-
- strm = reqFTP.GetRequestStream()
- contentLen = fs.Read(buff, 0, buffLength)
-
- While (contentLen <> 0)
- strm.Write(buff, 0, contentLen)
- contentLen = fs.Read(buff, 0, buffLength)
- End While
- Finally
- strm.Close()
- fs.Close()
- response.Close()
- End Try
- End Sub
-
-
- Public Function GetFileList(ByVal URI As String, Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "") As String()
- Dim downloadFiles() As String
- Dim result As StringBuilder = New StringBuilder()
- Dim reqFTP As FtpWebRequest = Nothing
- Dim response As WebResponse = Nothing
- Dim reader As StreamReader = Nothing
-
- If FTPUserID = "" Then
- FTPUserID = Me.UserID
- End If
-
- If FTPPassword = "" Then
- FTPPassword = Me.Password
- End If
-
- Try
- reqFTP = CType(FtpWebRequest.Create(URI), FtpWebRequest)
- reqFTP.UseBinary = True
- reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
- reqFTP.Method = WebRequestMethods.Ftp.ListDirectory
- response = reqFTP.GetResponse()
-
- reader = New StreamReader(response.GetResponseStream())
-
- Dim line As String = reader.ReadLine()
-
- While Not line Is Nothing
- result.Append(line)
- result.Append("\n")
- line = reader.ReadLine()
- End While
-
- result.Remove(result.ToString().LastIndexOf("\n"), 1)
-
- downloadFiles = result.ToString().Split("\n")
- Catch ex As Exception
- downloadFiles = Nothing
- Finally
- reader.Close()
- response.Close()
- End Try
-
- Return downloadFiles
- End Function
-
-
- Public Sub downloadFile(ByVal Uri As String, ByVal ToDownLoadFileName As String, ByVal LocalPath As String, Optional ByVal LocalFileName As String = "", Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "", Optional ByVal CountDownloadFile As Integer = 1, Optional ByVal ThisDownloadFile As Integer = 1)
- Dim result As StringBuilder = New StringBuilder()
- Dim reqFTP As FtpWebRequest = Nothing
- Dim response As FtpWebResponse = Nothing
- Dim reader As StreamReader = Nothing
-
- Dim ftpStream As Stream = Nothing
- Dim outputStream As FileStream = Nothing
-
- If FTPUserID = "" Then
- FTPUserID = Me.UserID
- End If
-
- If FTPPassword = "" Then
- FTPPassword = Me.Password
- End If
-
- If LocalFileName = "" Then
- LocalFileName = ToDownLoadFileName
- End If
-
- Try
-
- outputStream = New FileStream(LocalPath + "\\" + LocalFileName, FileMode.Create)
- reqFTP = CType(FtpWebRequest.Create(Uri + "/" + ToDownLoadFileName), FtpWebRequest)
- reqFTP.ConnectionGroupName = "MyGroup"
- reqFTP.UsePassive = True
- reqFTP.UseBinary = True
-
- reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
-
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
-
- response = CType(reqFTP.GetResponse(), FtpWebResponse)
- ftpStream = response.GetResponseStream()
-
- Dim cl As Long = response.ContentLength
- DownloadFileSize = response.ContentLength
- Dim bufferSize As Integer = 2048
-
- Dim readCount As Integer
- Dim buffer(bufferSize) As Byte
- readCount = ftpStream.Read(buffer, 0, bufferSize)
-
- While readCount > 0
- outputStream.Write(buffer, 0, readCount)
- readCount = ftpStream.Read(buffer, 0, bufferSize)
- Application.DoEvents()
- Dim o As New FileInfo(LocalPath + "\\" + LocalFileName)
- Main.Text = DownloadFileSize / 1024 & " = " & o.Length / 1024 & " " & "Скачано файлов: " & ThisDownloadFile & " из " & CountDownloadFile
- DownloadSize = o.Length
- End While
-
- Finally
- ftpStream.Close()
- outputStream.Close()
- response.Close()
- End Try
- End Sub
Вот работоспособный класс, который я использую. Это на тот случай, если кому-то понадобиться.
Еще остался вопрос. Теперь все работает. Но время от времени появляется ошибка "TimeOut", что время ожидания операции истекло. Мне непонятно, как обрабатывать такую ошибку, и перезапустить скачивание (например)? Ошибка появляется на этой строке: "response = CType(reqFTP.GetResponse(), FtpWebResponse)". Подскажите пожалуйста, а то из-за этого все программа "висит".
Ответить
|
Страница: 1 |
Поиск по форуму