В последнее время я читал множество статей о загрузке FTP в ASP.NET, и все они, кажется, имеют смысл, но каждый раз, когда я пытался их реализовать, я либо загружал пустой файл, либо вообще не загружал файл. Вот некоторые из статей, которые я читал:
- Управление FTP-передачами с веб-страницы ASP.NET Автор Джон Петерсон
- Элемент управления FileUpload не дает полный путь….ПОМОГИТЕ!!!!
- Как: загружать файлы с помощью веб-сервера FileUpload Управление
Это все отличные статьи, но, как я уже сказал, есть проблемы :(
Я точно знаю, в чем проблема, но не знаю, как ее исправить. Я могу передать имя файла из элемента управления FileUpload, но путь не существует из соображений безопасности. Однако для объекта StreamReader требуется полный путь к загружаемому файлу, так как, черт возьми, мне его получить? Я в своем уме! >.‹
Давайте воспользуемся примером Джона Петерсона, на который я ссылался выше. Вот код:
Protected Sub btnUploadFile_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myFtpWebRequest As FtpWebRequest
Dim myFtpWebResponse As FtpWebResponse
Dim myStreamWriter As StreamWriter
myFtpWebRequest = WebRequest.Create("ftp://ftp_server_name/filename.ext")
myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile
myFtpWebRequest.UseBinary = True
myStreamWriter = New StreamWriter(myFtpWebRequest.GetRequestStream())
'IT BREAKS HERE BECAUSE THE CLIENT PATH IS WRONG!!
myStreamWriter.Write(New StreamReader(Server.MapPath("filename.ext")).ReadToEnd)
myStreamWriter.Close()
myFtpWebResponse = myFtpWebRequest.GetResponse()
myFtpWebResponse.Close()
End Sub
Видеть? В загруженном файле нет данных :(
Теперь моя последняя реализация выглядит так, но загруженный файл намного больше исходного и поврежден. Серьезно, какого черта я делаю не так? Я потратил на это два ДОЛГИХ дня, гррр...
Protected Sub btnUploadFile2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myFtpWebRequest As FtpWebRequest
Dim myFtpWebResponse As FtpWebResponse
filename = Path.GetFileName(FileUpload1.FileName)
myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + filename), FtpWebRequest)
myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile
myFtpWebRequest.UseBinary = True
'NEW APPROACH USING THE STREAM OF THE FILE FROM THE FileUpload Control
'CORRECT BYTE LENGTH - in sourceStream.BaseStream
Dim sourceStream As New StreamReader(FileUpload1.FileContent)
'WRONG BYTE LENGTH - in sourceStream.ReadToEnd()
Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
sourceStream.Close()
myFtpWebRequest.ContentLength = fileContents.Length
Dim requestStream As Stream = myFtpWebRequest.GetRequestStream()
requestStream.Write(fileContents, 0, fileContents.Length)
requestStream.Close()
myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse)
myFtpWebResponse.Close()
End Sub
Большое спасибо Адаму Марасу за удивительный ответ. Я оставлю свои грубые ошибки здесь для тех, кто найдет эту тему;)