Почему загруженное изображение с локального хоста с помощью HttpWebRequest повреждено?

Исходный размер файла изображения (.jpg) составляет 49 КБ, но когда я загрузил его, размер файла составляет 87 КБ и он поврежден. Но для текстовых файлов это работает. Что мне нужно сделать для загрузки изображений с помощью HttpWebRequest или другого класса System.Net? Я использую XAMPP для локального хоста.

//Usage: HttpDownload("http://www.localhost/files/imagine.jpg", "seo.jpg");

    static async void HttpDownload(string remoteFileOrUri, string localFileName)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(remoteFileOrUri));
        HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
        StreamReader rdr = new StreamReader(response.GetResponseStream());
        StreamWriter sw = new StreamWriter(File.OpenWrite(localFileName));

        sw.Write(rdr.ReadToEnd());
        sw.Flush();

        rdr.Close();
        sw.Close();
        Console.WriteLine("fin!");
    }

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

Llama 10.04.2019 08:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вместо этого вы должны использовать простой FileStream:

using (var output = File.OpenWrite(localFileName))
{
    using (var responseStream = response.GetResponseStream())
    {
        await responseStream.CopyToAsync(output);
    }
}

К сожалению, это может быть не единственная ваша проблема, так как сжатие GZip (если сервер его использует) также может создавать проблемы. Вы можете объяснить это простым изменением настроек:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(remoteFileOrUri));

request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();

using (var output = File.OpenWrite(localFileName))
{
    using (var responseStream = response.GetResponseStream())
    {
        await responseStream.CopyToAsync(output);
    }
}

Это работает хорошо, но почему загруженный файл отличался от размера удаленного файла?

Ronald Abellano 10.04.2019 09:19

Как вы измеряете размер удаленного файла?

Llama 10.04.2019 09:23

щелкните правой кнопкой мыши файл, выберите свойства, затем см. Размер:

Ronald Abellano 10.04.2019 09:30

Я понятия не имею, почему размер может быть другим. Они должны быть побайтно идентичными.

Llama 10.04.2019 09:33

Другие вопросы по теме