С# сохранить файл из HTTP-запроса

Я пытаюсь загрузить и сохранить файл из HttpWebResponse, но им не удалось сохранить файл (кроме текстовых файлов) правильно.

Я думаю, что это как-то связано с этой частью:

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

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

Забыл упомянуть, это .NET CP 3.5, и у меня есть класс-оболочка класса HttpWebResponse для добавления OAuth и т.д.

Ответы

Ответ 1

Проблема в том, что вы интерпретируете двоичные данные как текст, даже если это не так - как только вы начинаете рассматривать контент как строку вместо байтов, у вас проблемы. Вы не указали детали своего класса-оболочки, но я предполагаю, что ваше свойство 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);
    }
}

Ответ 2

Используйте WebClient.DownloadFile. Вы можете сделать это вручную (что-то как это), но WebClient - лучший выбор для простой загрузки.