2016-12-16 10 views
0

내가 텍스트 파일에 저장된 여러 개의 URL이, 그들 각각은 내가 이러한 이미지를 다운로드하여 저장하기 위해 노력하고있어 https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png웹 클라이언트로 다운로드하기 전에 페이지가로드 될 때까지 기다립니다

같은 페이스 북의 이모티콘로 이어지는 링크입니다 내 디스크에. 좀 나에게 파일 손상 오류를주고, 10, 이미지의 일부가 확인 다운로드 말,

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

내 문제는 URL의 양이 작은 경우에도처럼, ​​DownloadFileAsync 뭔가를 웹 클라이언트를 사용하고 있습니다. 그래서 나는 파일이 끝날 때까지 다운로드 할 때까지 기다릴 필요하다고 생각하고 그것은 도움이되지 않았다이

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(); 
    } 
} 

처럼 DownloadFileCompleted 이벤트를 추가하고 난 손상된 파일에 자세히 살펴하기로 결정했다.

손상된 파일은 실제로 이미지 파일이 아닌 HTML 페이지로, 일부 리디렉션 JavaScript 코드가 이미지에 있거나 전체 HTML 페이지에서 내 브라우저가 지원되지 않는다고 나타났습니다.

내 질문은, 어떻게 실제로 이미지 파일이 완전히로드되어 다운로드 할 준비가 될 때까지 기다릴 수 있습니까?

EDIT 또한 using 문을 제거하려고했으나 도움이되지 않았습니다.

+1

은 현재의 문제와 관련되지 않을 수 있습니다,하지만 당신은 비동기 프로세스를 발로 후 *의 *를 폐기하고

webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (compatible; http://example.org/)"); 
('using'문을 통해) 비동기 프로세스를 시작한 객체. 나는 당신이 실제로 끝날 때까지 당신의'WebClient'를'폐기 '하지 않도록 당신의 객체 관리를 개선하려고합니다. 여전히 기본적인 사항을 익히기 위해 노력하고 있지만, 지금은 비동기를 무시하는 것이 좋습니다. –

+0

@Damien_The_Unbeliever 비동기도없이 시도했지만 단 하나의 파일 만 다운로드합니다. using 문을 제거하는 것에 대해 - 도움이되지 않았 으면 아래의 내 의견을 참조하십시오. –

+0

편집을 추가하는 것만으로도 이전에 요청한 [mcve]를 제공하는 것만 큼 유용하지는 않습니다. –

답변

1

아무 것도 다운로드로 손상되지 않습니다. 단순히 페이스 북을 결정할 때 (때로는 이상한 것입니다) 이미지를 클라이언트에 제공하고 싶지 않습니다.

문제를 일으키는 사용자 에이전트가없는 것처럼 보입니다. 당신이해야 할 모든 사용자 에이전트를 지정하고, 그것을 수정처럼 그 모양 :

+0

와우 나는 지금 더 큰 금액으로 테스트하고 있으며 효과가있다. 도움 주셔서 감사합니다. 나는 내 자신을 짐작하지 않았다. –

+0

@ tube-builder 일종의 전설 인 사람의 대답입니다. 그것은 일할 의무가있다. :) http://meta.stackexchange.com/questions/9134/jon-skeet-facts – Atul

+0

@Atul 그래, 나는 알고있다. :) –