2010-05-29 69 views
17

我試圖從HttpWebResponse下載並保存文件,但是如果沒有正確保存文件(文本文件除外),就會出現問題。C#從HTTP請求中保存文件

我覺得它的東西與這部分做的事:

byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content); 
MemoryStream stream = new MemoryStream(byteArray); 

文本文件與上面的代碼工作正常,但當我試圖將內容保存爲圖像文件也被損壞。 我怎樣寫這個「串」的數據爲圖像文件(和其他二進制文件)

忘了提,這是.NET 3.5 CP和我身邊有HttpWebResponse類的包裝類添加的OAuth等

+1

請發佈您的代碼,實際寫入文件。也許你正在用文本模式寫它。你應該用二進制模式編寫它。 – Senthil 2010-05-29 08:07:04

+0

@Senthil:不,它是有問題的閱讀代碼 - 這已經被顯示。 – 2010-05-29 08:09:29

+0

嗯..是Encoding.UTF8.GetBytes()部分的問題? – Senthil 2010-05-29 08:10:45

回答

44

問題在於,您將二進制數據解釋爲文本,即使它不是 - 只要您開始將內容視爲字符串而不是字節,就會遇到麻煩。你沒有給出你的包裝類的細節,但我假設你的Content屬性返回一個字符串 - 你將無法使用它。如果您的包裝類不讓您從Web響應獲取原始數據,則需要對其進行修改。

如果您使用.NET 4,你可以使用新的CopyTo方法:如果你不使用.NET 4

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    input.CopyTo(output); 
} 

,你必須做手工複製:

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 
+0

我認爲那是問題所在。 添加更多詳細信息(.NET Compact 3.5) – dkarzon 2010-05-29 08:08:03

+0

@ d1k_is:第二個片段應該在緊湊框架中正常工作(除了可能更改輸出流)。 – 2010-05-29 08:08:47

+0

是的,這是問題。所以我不得不修改httpresponse包裝器,以便將文件流讀取到文件中,而不僅僅是讀取Content字符串屬性。謝謝! – dkarzon 2010-05-29 09:03:46