【发布时间】:2011-12-06 08:44:48
【问题描述】:
我最近一直在阅读大量关于 ASP.NET 中的 FTP 上传的文章,它们似乎都很有意义,但每次我尝试实现它们时,要么上传一个空文件,要么根本没有文件。以下是我一直在阅读的一些文章:
- Managing FTP Transfers from an ASP.NET Web Page约翰·彼得森
- FileUpload Control Doesn’t Give Full Path….HELP!!!!
- How to: Upload Files with the FileUpload Web Server Control
它们都是很棒的文章,但就像我说的,有问题:(
我确切地知道问题出在哪里,但我不知道如何解决它。我可以从 FileUpload 控件传递文件名,但出于安全考虑,该路径不存在。但是,StreamReader 对象需要上传文件的完全限定路径,那么我到底是怎么得到的呢?我无计可施! >.
让我们使用上面链接的 John Peterson 的示例。代码如下:
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
看到了吗?上传的文件中没有数据:(
现在我的最新实现看起来像这样,但是上传的文件比源文件大得多,并且已损坏。说真的,我到底做错了什么?我已经在这上面呆了两天了,grrr...
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
非常感谢 Adam Maras 的精彩回答。我会把我的错误留在这里,让其他找到这个帖子的人受益;)
【问题讨论】:
-
@Jim:那么当服务器无法访问客户端文件路径时,我该怎么做呢? FileUpload 控件至少不支持这个。
-
您是否尝试先从文件上传中保存文件,然后尝试将其发送到 ftp 服务器?
-
@atbebtg 不,因为您应该能够将其直接发送到 FTP。通过网络服务器似乎很荒谬。如果这是唯一的方法,我不知道。我只是想逐个解决这个问题,但这让我发疯。
标签: asp.net vb.net ftp client ftp-server