Подождите загрузки страницы перед загрузкой с помощью WebClient

104
14

У меня есть несколько URL-адресов, хранящихся в текстовом файле, каждая из которых является ссылкой, ведущей к 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, но это тоже не помогло.

спросил(а) 2016-12-16T10:27:00+03:00 3 года, 7 месяцев назад
1
Решение
54

Ничто не повреждается вашей загрузкой - это просто решение Facebook (иногда это странно), что он не хочет показывать изображение вашему клиенту.

Похоже, что отсутствие пользовательского агента вызывает эту проблему. Все, что вам нужно сделать, это указать агент пользователя, и он выглядит так:

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

ответил(а) 2016-12-16T11:47:00+03:00 3 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема