Исходный размер файла изображения (.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 для вещей, которые не являются текстом. При их использовании применяется кодировка. Кодирование плохо сочетается с произвольными двоичными данными, о чем свидетельствует этот блог.
Вместо этого вы должны использовать простой 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);
}
}
Это работает хорошо, но почему загруженный файл отличался от размера удаленного файла?
Как вы измеряете размер удаленного файла?
щелкните правой кнопкой мыши файл, выберите свойства, затем см. Размер:
Я понятия не имею, почему размер может быть другим. Они должны быть побайтно идентичными.
Вы не должны использовать
StreamReader
иStreamWriter
для вещей, которые не являются текстом. При их использовании применяется кодировка. Прочтите это, чтобы узнать больше.