1

私はいくつかの URL をテキスト ファイルに保存しています。それぞれの URL は、 https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.pngのような Facebook 絵文字へのリンクです。

これらの画像をダウンロードしてディスクに保存しようとしています。私は DownloadFileAsync で WebClient を使用しています。

using (var client = new WebClient())  
{
    client.DownloadFileAsync(imgURL, imgName);
}

私の問題は、URL の数が 10 などと少ない場合でも、正常にダウンロードされる画像もあれば、ファイル破損エラーが表示されるものもあります。そのため、ファイルが最後までダウンロードされるのを待つ必要があると考え、このように DownloadFileCompleted イベントを追加しました

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Net;

class Program
{
    static Queue<string> q;

    static void Main(string[] args)
    {
        q = new Queue<string>(new[] {
            "https://www.facebook.com/images/emoji.php/v5/u51/1/16/1f603.png",
            "https://www.facebook.com/images/emoji.php/v5/ud2/1/16/1f604.png",
            "https://www.facebook.com/images/emoji.php/v5/ud4/1/16/1f606.png",
            "https://www.facebook.com/images/emoji.php/v5/u57/1/16/1f609.png",
            "https://www.facebook.com/images/emoji.php/v5/u7f/1/16/1f60a.png",
            "https://www.facebook.com/images/emoji.php/v5/ufb/1/16/263a.png",
            "https://www.facebook.com/images/emoji.php/v5/u81/1/16/1f60c.png",
            "https://www.facebook.com/images/emoji.php/v5/u2/1/16/1f60d.png",
            "https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png",
            "https://www.facebook.com/images/emoji.php/v5/u1e/1/16/1f61a.png"
        });
        DownloadItem();
        Console.WriteLine("Hit return after 'finished' has appeared...");
        Console.ReadLine();
    }

    private static void DownloadItem()
    {        
        if (q.Any())
        {
            var uri = new Uri(q.Dequeue());
            var file = uri.Segments.Last();

            var webClient = new WebClient();
            webClient.DownloadFileCompleted += DownloadFileCompleted;
            webClient.DownloadFileAsync(uri, file);
        }
        else 
        {
            Console.WriteLine("finished");
        }
    }

    private static void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        DownloadItem();
    }
}

それは役に立たなかったので、破損しているファイルを詳しく調べることにしました。

破損したファイルは実際には画像ファイルではなく、HTML ページで、画像へのリダイレクト JavaScript コードが含まれているか、ブラウザがサポートされていないことを示す完全な HTML ページであったようです。

私の質問は、画像ファイルが完全にロードされ、ダウンロードの準備ができるのを実際にどのように待つのですか?

編集私もusingステートメントを削除しようとしましたが、それも役に立ちませんでした。

4

1 に答える 1

2

ダウンロードによって破損しているものは何もありません。単に Facebook がクライアントに画像を提供したくないと判断しただけです (これは奇妙なこともあります)。

問題の原因はユーザー エージェントの欠如のようです。ユーザー エージェントを指定するだけで問題が解決するようです。

webClient.Headers.Add(HttpRequestHeader.UserAgent,
    "Mozilla/5.0 (compatible; http://example.org/)");
于 2016-12-16T08:47:17.993 に答える