我使用以下代码将文件上传到FTP,文件上传 - 问题是xls,pdf和视频文件,它们被破坏了。 Txt,sql保持不变,我已直接在FTP中检查过这个。我在想它与UTF8.GetBytes有什么关系?代码如下
Dim URI As String = Url & "/" & fileName
Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest)
ftp.Credentials = New System.Net.NetworkCredential(Username, Password)
ftp.Proxy = Nothing
ftp.KeepAlive = False
ftp.UsePassive = False
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile
Dim sourceStream As New StreamReader(file.InputStream)
Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
sourceStream.Close()
ftp.ContentLength = fileContents.Length
ftp.UsePassive = True
Dim requestStream As Stream = ftp.GetRequestStream()
requestStream.Write(fileContents, 0, fileContents.Length)
requestStream.Close()
Dim response As FtpWebResponse = DirectCast(ftp.GetResponse(), FtpWebResponse)
非常感谢任何帮助。
答案 0 :(得分:1)
这是问题所在:
Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
您正在将字符串作为字符串读取,就像它是UTF-8编码的文本一样,然后再将其转换回字节。你为什么要这样做?有问题的文件不是 UTF-8编码的文本,因此您不应该这样对待它们。
从流中读取二进制数据,从不将其转换为文本,除非您确定 文本数据。目前还不清楚file
的类型是什么,但希望你可以在没有读取整个内存的情况下获得的长度。然后您可以使用:
file.InputStream.CopyTo(requestStream)
复制所有数据。请注意,您应该使用Using
语句而不是手动关闭流,以避免在抛出异常时将它们保持打开状态。