我正試圖將PDF下載到我的桌面 - 有關每隔幾天使用新內容的PDF更新,我試圖查看是否有方法讓PDF自動更新它具有新鮮的內容,而不必去實際的鏈接。從網站下載PDF內容 -
- http://www.uakron.edu/dotAsset/1265971.pdf
我正試圖將PDF下載到我的桌面 - 有關每隔幾天使用新內容的PDF更新,我試圖查看是否有方法讓PDF自動更新它具有新鮮的內容,而不必去實際的鏈接。從網站下載PDF內容 -
- http://www.uakron.edu/dotAsset/1265971.pdf
假設這是甚至遠程一個編程問題,你可以嘗試一個HTTP HEAD查詢(理想情況下發送的If-Modified-Since頭在你的要求),並檢查響應頭 - 如果服務器友好,它會告訴你它是否沒有通過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");
}
}
}
謝謝馬克!我很感激。你能給我提供一個嘗試做這樣的事情嗎?我不知道如何去編碼。 – 2011-04-30 20:09:28
@Blake - 我測試過這個URL,它似乎不支持這個(很標準的東西)。然而,像WebClient或HtpWebRequest這樣的東西在這裏是你的朋友。 – 2011-04-30 20:18:35
@布萊克 - 見更新 – 2011-04-30 20:35:01
那麼,什麼是你的問題? – Oded 2011-04-30 19:58:38
呃,如果你不想'去實際的鏈接',你不能找出*任何東西*。 – 2011-04-30 19:59:45
嗯,我正在嘗試下載PDF並創建一個腳本,它將自動獲取所有更新,而無需轉到鏈接。 – 2011-04-30 20:05:19