2011-05-10 77 views
2

我正在從歷史數據庫中讀取數據,並且讀取每個URL,我正在下載它並將數據存儲到字符串中。我希望能夠確定鏈接是否是下載鏈接,即例如.exe或.zip。我假設我需要閱讀標題來確定這一點,但我不知道如何使用WebClient來完成。有什麼建議麼?檢查URL是否是使用webclient c的下載鏈接#

while (sqlite_datareader.Read()) 
{ 
    noIndex = false; 

    string url = (string)sqlite_datareader["url"]; 

    try 
    { 
     if (url.Contains("http") && (!url.Contains(".pdf")) && (!url.Contains(".jpg")) && (!url.Contains("https")) && !isInBlackList(url)) 
     { 

      WebClient client = new WebClient(); 
      client.Headers.Add("user-agent", "Only a test!"); 


      String htmlCode = client.DownloadString(url); 
     } 
    } 
} 

回答

1

而不是加載鏈接後面的完整內容,我會發出HEAD請求。

HEAD方法與GET相同,只是服務器不能在響應中返回消息體。 HTTP頭中包含的對HEAD請求作出響應的元信息應該與爲響應GET請求而發送的信息相同。此方法可用於獲取有關請求隱含的實體的元信息,而無需傳遞實體主體本身。此方法通常用於測試超文本鏈接的有效性,可訪問性和最近的修改。

報價的 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

見這些問題對於C#示例

1

你在正確的軌道上;你需要一個成功的請求後,檢查ResponseHeaders

var someType = "application/zip"; 
if (client.ResponseHeaders["Content-Type"].Contains(someType)) { 
    // this was a "download link" 
} 

最棘手的部分將是決定什麼構成一個下載鏈接,因爲有這麼多的內容類型成爲可能。例如,如何決定XML數據是否是下載鏈接?

+0

的確如此。也許有辦法在下載之前檢查數據的大小?但是,由於我看不到,沒有太多時間,.exe,.zip和.rar就足夠了。謝謝 – michelle 2011-05-10 13:39:47

+0

還好,我需要下載字符串或得到響應流。我之所以要過濾出.exe等是因爲我不需要下載它們。不幸的是,並不是所有的鏈接都在其URL中包含.exe,所以我需要看到響應標題:/ – michelle 2011-05-10 13:55:42

+2

您可以嘗試使用'DownloadStringAsync()'來代替。然後,只要有頭文件,您就可以確定如何處理內容,並取消或允許下載完成。 – Yuck 2011-05-10 14:17:50

1

嘗試檢查WebClient的ResponseHeaders集合以驗證響應文件類型。

0

在的情況下,任何人有同樣的問題,我已經使用屬性在歷史悠久的地方出現的.sqlite數據庫非常方便!

Places.sqlite包含一個名爲moz_historyvisits的表,其中包含一個列visit_type。根據[1],7的visit_type是下載鏈接。因此,讀取這個值將決定它是否是一個下載鏈接,而不讀取響應頭或甚至發送一個頭部方法。

[1] http://www.firefoxforensics.com/research/moz_historyvisits.shtml