2011-05-10 55 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