是否可以从Web服务器获取图像的大小(可能是以字节为单位)而不加载它?
Web服务器是否具有与文件大小相关的可访问属性(字段)?这样可以在不加载的情况下检查图像大小。
通常,当Web服务器的目录加载到浏览器中时,它会从服务器端告诉您每个文件的大小。作为ASP开发人员,我可以访问该数据吗?
我正在使用C#.Net 4
编辑:我充当客户端并从其他网络服务器请求此信息。
一如既往地感谢任何帮助。 亚历
答案 0 :(得分:11)
您的意思是当您是服务器或客户端时?
如果您是服务器,您可以找到任何其他任何文件(假设图像流来自文件)。
new FileInfo(path).Length;
如果您的意思是您正在使用客户端代码(您正在访问其他网络服务器)
执行HEAD请求。虽然某些服务器的行为不正确,但对HEAD的正确响应与GET的响应非常相似,只是未发送实体。
例如,要获取此页面上使用的精灵PNG,浏览器会对http://sstatic.net/stackoverflow/img/sprites.png执行GET,从而产生响应:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Aug 2010 01:06:21 GMT
Content-Type: image/png
Connection: keep-alive
Cache-Control: max-age=604800
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT
Accept-Ranges: bytes
X-Powered-By: ASP.NET
Content-Length: 18607
后跟实际图像文件的八位字节。
执行HEAD而非get结果:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Aug 2010 01:07:20 GMT
Content-Type: image/png
Connection: keep-alive
Cache-Control: max-age=604800
Content-Length: 18607
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT
Accept-Ranges: bytes
X-Powered-By: ASP.NET
几乎相同但没有实体主体。此时我们可以看到图像大小为18607字节,而不是实际下载它。如果图像将被分块发送,则此方法将无法工作,因为内容长度不会在标头中发送。
编辑:
值得指出的是,有时使用分块内容,您将别无选择,只能下载整个内容,因为服务器在开始发送时不会说(甚至可能不知道)大小。遗憾的是,这也可能适用于特别大的流。令人高兴的是,这不太可能与图像一起使用。
答案 1 :(得分:2)
System.IO.FileInfo fi = new System.IO.FileInfo(filepath);
fi.Length();
如果您需要/想要通过HTTP严格执行此操作,则应尝试捕获请求附带的Content-Length标头。它可能并不总是存在,所以你必须试验它并确保web服务器准确地说明文件长度。例如,如果它是来自脚本的图像,则可能缺少Content-Length标头(在这种情况下,对某人感到羞耻)。
如果缺少Content-Length,那么我很确定没有下载它就无法通过HTTP确定文件的大小。 Content-Length标题用于这种事情。
答案 2 :(得分:1)
有许多Web服务器不提供Content-Length字段。您必须确保您的代码能够容忍这一点。