2010-05-29 2 views
17

Im пытается загрузить и сохранить файл из HttpWebResponse, но им не удалось сохранить файл (кроме текстовых файлов) правильно.C# сохранить файл из HTTP-запроса

Я думаю, что его что-то делать с этой частью:

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

Текстовые файлы прекрасно работают с кодом выше, но при попытке сохранить содержимое в файл изображения он будет поврежден. Как я пишу это «строка» данные файла изображения (и другие двоичные файлы)

забыл упомянуть, это .NET CP 3,5 и у меня есть класс-обертку класса HttpWebResponse добавить OAuth и т.д.

+1

Пожалуйста, разместите свой код, который фактически записывается в файл. Возможно, вы пишете его в текстовом режиме. Вы должны писать его в двоичном режиме. – Senthil

+0

@ Senthil: Нет, это код чтения, который проблематичен - и это уже было показано. –

+0

Хммм .. проблема в кодировке.UTF8.GetBytes()? – Senthil

ответ

44

Проблема в том, что вы интерпретируете двоичные данные как текст, даже если это не так - как только вы начинаете рассматривать контент как строку вместо байтов, у вас проблемы. Вы не указали детали своего класса-оболочки, но я предполагаю, что ваше свойство Content возвращает строку - вы не сможете ее использовать. Если ваш класс-оболочка не позволяет вам получить необработанные данные из веб-ответа, вам необходимо его изменить.

Если вы используете .NET 4, вы можете использовать новый метод CopyTo:

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

Если вы не используете .NET 4, вы должны сделать копирование вручную:

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

Yeh Я думал, что это проблема. Добавлено подробнее (.NET Compact 3.5) – dkarzon

+0

@ d1k_is: Второй фрагмент должен отлично работать в компактном каркасе (кроме, возможно, изменения выходного потока). –

+0

Да, это была проблема. Поэтому мне пришлось модифицировать оболочку httpresponse, чтобы она считывала поток в файл, а не только свойство Content string. Благодаря! – dkarzon