0

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

任何帮助将不胜感激。

4

1 回答 1

1

这就是问题:

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

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

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

file.InputStream.CopyTo(requestStream)

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

于 2012-11-26T15:53:36.607 回答