2012-11-26 61 views
0

我正在使用下面的代碼上傳文件到FTP,文件上傳 - 問題是與xls,pdf和視頻文件,他們被損壞。 TXT,SQL保持不變,我已經直接在FTP中檢查過。我在想它與UTF8.GetBytes有關嗎?代碼如下使用Encoding.UTF8.GetBytes會破壞xls/video文件?

   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

這就是問題所在:

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

您正在閱讀的流作爲一個字符串,就好像它是UTF-8編碼的文本,然後再轉換回字節。你爲什麼要這樣做?問題中的文件不是 UTF-8編碼的文本,因此您不應該這樣對待它們。從流

閱讀二進制數據,從未將其轉換爲文本,除非你確定它確實文本數據。目前還不清楚file的類型是什麼,但希望你可以得到長度而不是將整個事情讀入記憶。然後您可以使用:

file.InputStream.CopyTo(requestStream) 

複製所有數據。請注意,您應該使用Using語句而不是手動關閉流,以避免在拋出異常時將其打開。

+0

非常好,謝謝你的幫助:) – Judef