2016-12-16 148 views
0

我存儲在一個文本文件中多個URL,它們中的每一個環節導致Facebook的表情符號,像https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png等待頁面加載

我試圖下載這些圖像,並將其儲存在我的磁盤上。我使用的Web客戶端與DownloadFileAsync,像

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

我的問題是,即使網址的量很小,比如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聲明,但這也沒有幫助。

+1

可能與您當前的問題沒有關係,但是您正在啓動異步進程,然後*處置*對象,你已經開始了異步處理(通過'using'語句)。我希望在這裏改進對象管理,以便在實際完成之前不要「拋棄」WebClient。雖然你仍然試圖讓基礎知識正確,但我可能會建議現在忽略異步。 –

+0

@Damien_The_Unbeliever嘗試沒有異步,但只下載一個文件(可能在這裏丟失的東西)。關於刪除使用語句 - 這沒有幫助,請參閱下面的我的評論。 –

+0

只需添加該編輯功能就不像提供之前請求的[mcve]一樣有用。 –

回答

1

沒有什麼東西被你的下載破壞 - 它只是Facebook決定(有時候,這很奇怪)它不想將圖像提供給你的客戶端。

它看起來像缺少導致問題的用戶代理。你需要做的就是指定用戶代理,看起來像修復它:

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

哇我現在測試它的數量更大,它確實有效。非常感謝您的幫助!我絕不會自己猜出這個。 –

+0

@ tube-builder這是一個來自某個傳奇人物的答案。它必然會工作。 :) http://meta.stackexchange.com/questions/9134/jon-skeet-facts – Atul

+0

@Atul是啊我知道那:) –