45336


表題の通り、WebClient.DownloadFileを使用して、Web上のイメージをローカル内に保存しようとするのですが、処理は成功しても、保存されたイメージファイルが破損しているか何かで正しく保存されていません。

ただ、すべて失敗しているかというとそうでもなく、正しく保存されている画像もあり、ソースの方でも例外などを出している様子もありません。コードの方の問題ではなく、ひょっとしたらネットのセキュリティの何なのかという気もするのですが、そこまでわかりませんでした。

原因と対策をお教えください。

下記にコードを記述します。

[code]

    private bool saveImage(string filepath)
    {
        try
        {
    　　　　　　　// TARGETPATH = "C:\image"
            if(!Directory.Exists(this.TARGETPATH))
            {
                Directory.CreateDirectory(this.TARGETPATH);
            }
            System.Net.WebClient wc = new System.Net.WebClient();
            wc.DownloadFile(filepath, this.TARGETPATH + @"\" + Path.GetFileName(filepath));
            wc.Dispose();
            return true;
        }
        catch
        {
            return false;
        }
    }
    
[/code]


CC BY-SA 4.0
2018-07-02T08:17:55.427
45234
2022-07-30T05:38:05.373
2022-07-30T05:38:05.373
3060
9374
question
c# 画像
C#でWebからWebClientでイメージをDownloadFileをすると、画像が壊れて開けない


ダウンロードする画像が、ブラウザーであれば見えてダウンロードもできるのであれば、送信時の圧縮のためという可能性が高いです。

教科書的には、送信時の圧縮はAccept-
Encodingを見て行う、画像は既に圧縮がかかっているので送信時には圧縮をしないとなっていますが、現実には、全てのブラウザーが圧縮に対応しているので強制的に送信時圧縮をしているケースがあること、Googleが高圧縮の`Zopfli`や`Brotli`を開発したことから画像にも送信時圧縮をかけているケースがあります。

したがって、単純にWebClientを使うのは無理で、まず、`gzip`と`deflate`に対応させておく必要があります。コードは以下のような感じでしょうか？また、`Brotli`に対応していれば対応させておくのがいいし、対応していなければブラウザーで`Brotli`に対応していないのはIE11だけなのでユーザーエージェントでIE11とわかるようにしておくのがいいでしょう。

[code]

    class MyWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            return request;
        }
    }
    
[/code]

それでも駄目な場合は、ヘッドレスのブラウザーを操作してダウンロードするしかないでしょう。ヘッドレスのEdgeは開発ができていない（ 参考 [headless
browser for testing](https://wpdev.uservoice.com/forums/257854-microsoft-edge-
developer/suggestions/6545168-headless-browser-for-testing)
）ようなので、ヘッドレスChromeとGoogle純正のpuppeteerというライブラリーを使うのが便利です。


CC BY-SA 4.0
2018-07-05T13:47:27.517
45336
2018-07-05T23:13:48.287
2018-07-05T23:13:48.287
15171
15171
45234
answer