2011-04-30 5 views
1

바탕 화면에 PDF를 다운로드하려고합니다. - 새로운 콘텐츠가있는 며칠마다 PDF가 업데이트되며, PDF를 자동으로 업데이트 할 수있는 방법이 있는지 확인하려고했습니다. 실제 링크로 이동하지 않고도 신선한 콘텐츠가있을 때 그 자체입니다.웹 사이트에서 PDF 콘텐츠 다운로드 -

-이 가정 http://www.uakron.edu/dotAsset/1265971.pdf

+1

따라서, 귀하의 질문에 무엇입니까? – Oded

+2

Erm, '실제 링크로 이동'하고 싶지 않으면 * 아무 것도 * 찾을 수 없습니다. –

+0

Uhm, PDF를 다운로드하고 링크로 이동하지 않고 자동으로 모든 업데이트를 자동으로 가져 오는 스크립트를 만들려고합니다. –

답변

2

경우에도 원격으로 프로그래밍 질문, 당신은, 그리고 검사 응답 헤더 (이상적으로 귀하의 요청에 헤더 IF-때문에-수정을 보내는)는 HTTP의 HEAD 쿼리를 시도 할 수 있었다 - 서버가 친숙하면 304 응답 코드를 통해 업데이트되지 않았는지 여부를 알려줍니다.

304가 없으면 GET 요청을 보내고 응답 스트림을 저장하십시오.

마지막으로 수정 한 (HEAD 건너 뛰기) GET을 시도해 볼 수도 있습니다. 그러나 HEAD 요청은 서버가 단지 GET와 완전히 행복하지 않은 경우 304

가 광범위하게 테스트 없음/일부 대역폭을 절약하지만, 수 있습니다

using System; 
using System.IO; 
using System.Net; 

static class Program 
{ 
    static void Main() 
    { 
     string url = "http://www.uakron.edu/dotAsset/1265971.pdf", localPath = "1265971.pdf"; 

     var req = (HttpWebRequest)WebRequest.Create(url); 
     req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
     req.Headers.Add("Accept-Encoding","gzip,deflate"); 
     if(File.Exists(localPath)) 
      req.IfModifiedSince = File.GetLastWriteTimeUtc(localPath); 
     try 
     { 
      using (var resp = req.GetResponse()) 
      { 
       int len; 
       checked 
       { 
        len = (int)resp.ContentLength; 
       } 
       using (var file = File.Create(localPath)) 
       using (var data = resp.GetResponseStream()) 
       { 
        byte[] buffer = new byte[4 * 1024]; 
        int bytesRead; 
        while (len > 0 && (bytesRead = data.Read(buffer, 0, Math.Min(len, buffer.Length))) > 0) 
        { 
         len -= bytesRead; 
         file.Write(buffer, 0, bytesRead); 
        } 
       } 
      } 
      Console.WriteLine("New version downloaded"); 
     } 
     catch (WebException ex) 
     { 
      if (ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError) 
       throw; 
      Console.WriteLine("Not updated"); 
     } 
    } 
} 
+0

감사합니다. Marc! 감사합니다. 이런 식으로 뭔가를 시도해 볼 수있는 링크를 제공 할 수 있습니까? 나는 이것을 코딩하는 방법에 대해 잘 모릅니다. –

+0

@Blake - 나는 그 URL을 테스트했고, 이것 (대부분 표준적인 것들)을 많이 지원하지는 않는다. 그러나'WebClient' 나'HtpWebRequest' 같은 것들이 여러분의 친구입니다. –

+0

@Blake - 업데이트 참조 –

관련 문제