私は 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)
{
}
これは主に、バイナリZipファイルを処理するために_StreamWriter : TextWriter
_を使用するためです。 StreamWriterはテキストを期待し、エンコーディングを適用します。そして、単純なASCIIエンコーダーでも、無効な行末であると考えられるものを「修正」しようとする場合があります。
すべてのコードを次のコードに置き換えることができます。
_ using (var client = new WebClient())
{
client.DownloadFile("http://something", @"D:\Downloads\1.Zip");
}
_
注 新しいコードでは、WebClientではなくHttpClientを確認する必要があります。
次に、using( ) { }
を使用しないでください
2ライナーには WebClient
を使用できます。
using(WebClient wc = new WebClient())
{
wc.DownloadFile(url, @"D:\Downloads\1.Zip");
}
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);
}
}
}
}