如何从http头获取文件大小


56

我想在下载之前获取http:/.../文件的大小。该文件可以是网页,图像或媒体文件。这可以通过HTTP头完成吗?如何下载文件HTTP头?

84

是,假设你交谈支持HTTP服务器/允许这样的:

System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://stackoverflow.com/robots.txt"); 
req.Method = "HEAD"; 
using (System.Net.WebResponse resp = req.GetResponse()) 
{ 
    int ContentLength; 
    if(int.TryParse(resp.Headers.Get("Content-Length"), out ContentLength)) 
    { 
     //Do something useful with ContentLength here 
    } 
} 

如果使用HEAD方法是不允许的,或者Content-Length头中不存在的服务器答复确定服务器上内容大小的唯一方法是下载它。由于这不是特别可靠,大多数服务器都会包含这些信息。

+11

如果您使用'使用',它会自动处理它。 http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx 16 4月. 132013-04-16 20:12:14

+2

另一个需要注意的地方是,如果你使用它来处理非常大的文件“int”还不够,你需要使用'long ContentLength;'和'long.TryParse(xxx)'来支持超过2.14GB的返回值。 16 10月. 152015-10-16 04:27:33

  0

是否启用http压缩功能会抛弃实际的文件大小? 17 7月. 162016-07-17 23:06:01


25

这可以通过HTTP头完成吗?

是的,这是要走的路。 如果提供的信息是,它的标题为Content-Length。但请注意,情况并非一定如此。

只下载头可以使用HEAD请求而不是GET来完成。也许下面的代码帮助:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com/"); 
req.Method = "HEAD"; 
long len; 
using(HttpWebResponse resp = (HttpWebResponse)(req.GetResponse())) 
{ 
    len = resp.ContentLength; 
} 

通知的属性为HttpWebResponse对象的内容长度 - 无需手动解析Content-Length头。

  0

上面的'resp.ContentLength'不会让你知道HEAD响应的长度,而不是你有兴趣获得sizeof的文件的长度吗? 19 4月. 112011-04-19 12:47:28

+1

@Adam否文档中说:“ContentLength属性包含与响应一起返回的Content-Length标头的值。” 19 4月. 112011-04-19 12:57:06

+1

正确的是,感谢Konrad。 20 4月. 112011-04-20 12:15:05

  0

确保你调用了resp.Close(),否则你在一次发出多个请求时可能会遇到超时错误(我的第三个请求在foreach循环中超时,通过关闭每个响应来解决) 25 3月. 132013-03-25 20:56:43

+2

@Eric实际上你应该在这里使用'Using'块,或者实现一次性模式来显式地管理资源的生命周期。除非确保它始终*发生,否则手动调用'Close'还是不够的,即使在出现错误的情况下也是如此。 25 3月. 132013-03-25 20:59:32

  0

@KonradRudolph你是对的。调用Close()修正了我在测试这个bug时的错误,但是使用block是正确的方法。 DERP。 26 3月. 132013-03-26 00:59:02

  0

@KonradRudolph,FYI,'ContentLength'返回一个'long'。不是什么大不了的事情,但以防万一你想解决它。 02 5月. 132013-05-02 00:14:08


0
WebClient webClient = new WebClient(); 
webClient.OpenRead("http://stackoverflow.com/robots.txt"); 
long totalSizeBytes= Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]); 
Console.WriteLine((totalSizeBytes));