C # сохранить файл из HTTP-запроса - PullRequest
22 голосов
/ 29 мая 2010

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

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

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

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

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

Ответы [ 3 ]

50 голосов
/ 29 мая 2010

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

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

0 голосов
/ 10 мая 2018

Самый простой способ, который я нашел, это:

  • Используйте ReadAsByteArrayAsync для получения данных.
  • Элемент списка File.WriteAllBytes для сохранения файла.

Не нужно ничего перебирать. Пример в контексте ниже:

[TestClass]
public class HttpTests
{
    [TestMethod]
    public void TestMethod1()
    {
        var jsObject = (dynamic)new JObject();
        jsObject.html =  "samplehtml.html";
        jsObject.format = "jpeg";
        const string url = "https://mywebservice.com/api";

        var result =   GetResponse(url, jsObject).GetAwaiter().GetResult();
        File.WriteAllBytes($@"c:\temp\httpresult.{jsObject.format}", result);
    }

    static async Task<byte[]> GetResponse(string uri, dynamic jsObj)
    {
        var httpClient = new HttpClient();
        var load = jsObj.ToString();
        var content = new StringContent(load, Encoding.UTF8, "application/json");
        var response = await httpClient.PostAsync(uri, content);
        return await response.Content.ReadAsByteArrayAsync();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...