Почему скачанный образ с локального хоста с помощью HttpWebRequest поврежден? - PullRequest
4 голосов
/ 10 апреля 2019

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

//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!");
    }

1 Ответ

0 голосов
/ 10 апреля 2019

Вы не должны использовать 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...