从Web服务器获取图像的大小而不加载它

时间:2010-08-17 01:02:14

标签: c# asp.net image

是否可以从Web服务器获取图像的大小(可能是以字节为单位)而不加载它?

Web服务器是否具有与文件大小相关的可访问属性(字段)?这样可以在不加载的情况下检查图像大小。

通常,当Web服务器的目录加载到浏览器中时,它会从服务器端告诉您每个文件的大小。作为ASP开发人员,我可以访问该数据吗?

我正在使用C#.Net 4

编辑:我充当客户端并从其他网络服务器请求此信息。

一如既往地感谢任何帮助。 亚历

3 个答案:

答案 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();

Psst,只是一个提示:http://www.google.ca/#hl=en&source=hp&q=c%23+get+file+size&aq=f&aqi=g4g-m2&aql=&oq=&gs_rfai=&fp=e6a957a020d2d8f6

如果您需要/想要通过HTTP严格执行此操作,则应尝试捕获请求附带的Content-Length标头。它可能并不总是存在,所以你必须试验它并确保web服务器准确地说明文件长度。例如,如果它是来自脚本的图像,则可能缺少Content-Length标头(在这种情况下,对某人感到羞耻)。

如果缺少Content-Length,那么我很确定没有下载它就无法通过HTTP确定文件的大小。 Content-Length标题用于这种事情。

答案 2 :(得分:1)

有许多Web服务器不提供Content-Length字段。您必须确保您的代码能够容忍这一点。