Как загрузить zip файл в С#?
Я использую HTTP GET, который загружает zip файл в браузер, что-то вроде https://example.com/up/DBID/a/rRID/eFID/vVID (не точный URL)
Теперь, когда я пытаюсь выполнить ту же загрузку в коде С# (тот же метод GET, что и выше) для настольного приложения, загруженный zip файл не является допустимым архивным файлом. Когда я открыл этот файл в блокноте, это была какая-то HTML-страница.
Я думаю, что неправильно настраиваю заголовок. Я посмотрел вокруг для примеров. Я нашел несколько загрузок, но ничего не увидел для загрузки.
Код:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/zip";
try
{
HttpWebResponse res = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default))
{
StreamWriter oWriter = new StreamWriter(@"D:\Downloads\1.zip");
oWriter.Write(sr.ReadToEnd());
oWriter.Close();
}
res.Close();
}
catch (Exception ex)
{
}
Ответы
Ответ 1
Это в основном потому, что вы используете StreamWriter : TextWriter
для обработки двоичного файла Zip. StreamWriter ожидает текст и будет применять кодировку. И даже простой кодировщик ASCII может попытаться "исправить" то, что, по его мнению, является недопустимым окончанием строки.
Вы можете заменить весь свой код на:
using (var client = new WebClient())
{
client.DownloadFile("http://something", @"D:\Downloads\1.zip");
}
Обратите внимание, что для нового кода вы должны смотреть на HttpClient вместо WebClient.
И тогда не используйте using( ) { }
Ответ 2
Вы можете просто использовать WebClient
для 2-лайнера:
using(WebClient wc = new WebClient())
{
wc.DownloadFile(url, @"D:\Downloads\1.zip");
}
Ответ 3
Вы также можете использовать System.Net.Http.HttpClient
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(downloadURL))
{
using(var stream = await response.Content.ReadAsStreamAsync())
{
using(Stream zip = FileManager.OpenWrite(ZIP_PATH))
{
stream.CopyTo(zip);
}
}
}
}