在使用WebClient下载之前等待页面加载



我在文本文件中存储了几个URL,每个URL都是导致Facebook表情符号的链接,例如https://www.facebook.com/images/images/emoji.php/v5/u75/1/16/1f618.png

我正在尝试下载这些图像并将其存储在我的磁盘上。我正在使用downloadfileasync的WebClient,例如

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

我的问题是,即使URL的数量很小,例如10,有些图像可以下载,有些图像给我一个文件损坏的错误。因此,我认为我需要等待下载文件直到结束并添加下载filecompleted事件,例如

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页面,说我的浏览器不受支持。

所以我的问题是,我如何实际等待图像文件已满并准备下载?

edit 我也尝试删除using语句,但这也无济于事。

您的下载都没有任何破坏 - 只是Facebook决定(有时,这很奇怪),它不想将图像提供给您的客户。

看来缺乏引起问题的用户代理。您需要做的就是指定用户代理,看起来它可以修复它:

webClient.Headers.Add(HttpRequestHeader.UserAgent,
    "Mozilla/5.0 (compatible; http://example.org/)");

相关内容

  • 没有找到相关文章

最新更新