【问题标题】:Get the size of an image without loading it, from a webserver从网络服务器获取图像的大小而不加载它
【发布时间】:2011-03-30 17:46:47
【问题描述】:

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

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

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

我正在使用 C# .Net 4

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

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

【问题讨论】:

    标签: c# asp.net image


    【解决方案1】:

    你的意思是当你是服务器还是客户端?

    如果您是服务器,您可以找到任何其他文件的任何内容(假设图像流来自文件)。

    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
    

    几乎相同但没有实体主体。此时我们可以看到图片大小为18607bytes,没有实际下载。如果图像被分块发送,此方法将不起作用,因为内容长度不会在标头中发送。

    编辑:

    值得指出的是,有时对于分块内容,您别无选择,只能下载整个内容,因为服务器在开始发送时不会说(甚至可能不知道)大小。可悲的是,这也可能用于特别大的流。令人高兴的是,这不太可能用于图像。

    【讨论】:

    • 我是客户,是的。所以 FileInfo 将不起作用,然后我看到了。 HEAD 信息是要走的路,尽管这里提到了陷阱。
    • 你的意思不是 18607 字节吗?
    • 哈哈。我复制粘贴了,所以我不可能输入错误,然后我错误地复制粘贴了 max-age。已修复,谢谢。
    • 这个信息会在HttpWebResponse 对象中作为response.Headers["Content-Length"]; 找到吗?我猜明天会发现 - 非常感谢!
    • 确实会(我不确定 ContentLength 属性,我依稀记得在这种情况下该属性的行为有点奇怪)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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 标头。但它可能并不总是存在,因此您必须对此进行试验并确保网络服务器准确地说明文件长度。例如,如果它是来自脚本的图像,则可能缺少 Content-Length 标头(在这种情况下,可耻)。

      如果缺少 Content-Length,那么我很确定如果不下载文件,就无法通过 HTTP 确定文件的大小。 Content-Length 标头正是用于这类事情。

      【讨论】:

      • .. 好消息。我想到了 HTTP 标头检查,而您已经通过 Content-Length 完美地定义了这一点。我们总是可以跳过任何不可靠的标题数据,但希望大部分内容都可用。谢谢...明天我实施时会告诉你进展如何。这里是凌晨 2.16 点!!! :)
      • 如果它是用Transfer-Encoding: Chunked 发送的,那么任何人都不会感到羞耻,因为它不能(在 RFC 2119 中大写的“MUST NOT”的意义)被发送,如果它被发送,它必须被忽略。
      • System.IO.FileInfo 是处理网络数据还是只处理本地数据?文件路径可以是 URI 吗?
      • 本地,或使用 UNC 用于您也有文件访问权限的机器,而不是 Web。
      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2013-01-09
      • 2013-03-25
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多