使用Encoding.UTF8.GetBytes会破坏xls / video文件?

时间:2012-11-26 15:51:43

标签: asp.net vb.net

我使用以下代码将文件上传到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) 

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这是问题所在:

Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())

您正在将字符串作为字符串读取,就像它是UTF-8编码的文本一样,然后再将其转换回字节。你为什么要这样做?有问题的文件不是 UTF-8编码的文本,因此您不应该这样对待它们。

从流中读取二进制数据,从不将其转换为文本,除非您确定 文本数据。目前还不清楚file的类型是什么,但希望你可以在没有读取整个内存的情况下获得的长度。然后您可以使用:

file.InputStream.CopyTo(requestStream)

复制所有数据。请注意,您应该使用Using语句而不是手动关闭流,以避免在抛出异常时将它们保持打开状态。