web-dev-qa-db-ja.com

C#でZipファイルをダウンロードするにはどうすればよいですか?

私は https://example.com/up/DBID/a/rRID/eFID/vVID のようなブラウザでZipファイルをダウンロードするHTTP GETを使用します(正確なURLではありません)

今、デスクトップアプリケーションに対してC#コード(上記と同じGETメソッド)で同じダウンロードを実行しようとすると、ダウンロードされたZipファイルは有効なアーカイブファイルではありません。このファイルをメモ帳で開いたところ、HTMLページでした。

一部のヘッダーを正しく設定していないと思います。例を探しました。いくつかのwrtアップロードを見つけましたが、ダウンロードについては何も表示されませんでした。

コード:

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)
{
}
17
Merrin

これは主に、バイナリZipファイルを処理するために_StreamWriter : TextWriter_を使用するためです。 StreamWriterはテキストを期待し、エンコーディングを適用します。そして、単純なASCIIエンコーダーでも、無効な行末であると考えられるものを「修正」しようとする場合があります。

すべてのコードを次のコードに置き換えることができます。

_  using (var client = new WebClient())
  {
    client.DownloadFile("http://something",  @"D:\Downloads\1.Zip");
  }
_

新しいコードでは、WebClientではなくHttpClientを確認する必要があります。
次に、using( ) { }を使用しないでください

39
Henk Holterman

2ライナーには WebClient を使用できます。

using(WebClient wc = new WebClient())
{
   wc.DownloadFile(url, @"D:\Downloads\1.Zip");
}
7
BrokenGlass

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);
                  }
             }
        }
}
0
Ruben Sebastian