在使用 WebClient 下载之前等待页面加载
Wait for page load before downloading with WebClient
我在文本文件中存储了多个 URL,每个都是 link 指向 Facebook 表情符号,例如 https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png
我正在尝试下载这些图像并将它们存储在我的磁盘上。我将 WebClient 与 DownloadFileAsync 一起使用,类似于
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 页面说不支持我的浏览器。
所以我的问题是,我实际上如何等待图像文件已完全加载并准备好下载?
EDIT 我也曾尝试删除 using
语句,但这也无济于事。
您的下载没有损坏任何内容 - 这只是 Facebook 决定(有时,这很奇怪)它不想将图像提供给您的客户。
看来是缺少用户代理导致了这个问题。您需要做的就是指定用户代理,看起来它修复了它:
webClient.Headers.Add(HttpRequestHeader.UserAgent,
"Mozilla/5.0 (compatible; http://example.org/)");
我在文本文件中存储了多个 URL,每个都是 link 指向 Facebook 表情符号,例如 https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png
我正在尝试下载这些图像并将它们存储在我的磁盘上。我将 WebClient 与 DownloadFileAsync 一起使用,类似于
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 页面说不支持我的浏览器。
所以我的问题是,我实际上如何等待图像文件已完全加载并准备好下载?
EDIT 我也曾尝试删除 using
语句,但这也无济于事。
您的下载没有损坏任何内容 - 这只是 Facebook 决定(有时,这很奇怪)它不想将图像提供给您的客户。
看来是缺少用户代理导致了这个问题。您需要做的就是指定用户代理,看起来它修复了它:
webClient.Headers.Add(HttpRequestHeader.UserAgent,
"Mozilla/5.0 (compatible; http://example.org/)");