Как загрузить 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);
                  }
             }
        }
}