【问题标题】:Size of uploaded file上传文件的大小
【发布时间】:2010-09-21 19:04:56
【问题描述】:

将文件上传到服务器时,Web 浏览器是否会在 http 标头中发送文件大小?如果是这样的话,是否可以只通过读取文件头来拒绝文件,而不是等待整个上传过程完成?

【问题讨论】:

    标签: http file upload http-headers browser


    【解决方案1】:
    1. 我不确定,但您不应该真正信任标头中发送的任何内容,因为它可能被用户伪造。

    2. 这取决于服务器的工作方式。例如,在 PHP 中,您的脚本在文件上传完成之前不会运行,因此这是不可能的。

    【讨论】:

      【解决方案2】:

      http://www.faqs.org/rfcs/rfc1867.html

      HTTP 客户端是 鼓励为整个文件输入提供内容长度,以便 繁忙的服务器可以检测建议的文件数据是否太大而无法存储 合理处理

      但内容长度不是必需的,因此您不能依赖它。此外,攻击者可以伪造错误的内容长度。

      读取文件内容是唯一可靠的方法。话虽如此,如果内容长度存在并且太大,关闭连接将是合理的做法。

      此外,内容是作为多部分发送的,因此大多数现代框架首先对其进行解码。这意味着在框架完成之前您不会获得文件字节流,这可能意味着“直到整个文件上传”。

      【讨论】:

        【解决方案3】:

        编辑:在走得太远之前,您可能需要根据 apache 配置检查这个其他答案:Using jQuery, Restricting File Size Before Uploading。以下描述仅在您确实需要更多自定义反馈时才有用。

        是的,您可以在允许上传整个文件之前预先获取一些信息。

        以下是来自具有enctype="multipart/form-data" 属性的表单的标题示例:

        POST / HTTP/1.1
        Host: 127.0.0.1:8000
        User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        Accept-Language: en-us,en;q=0.7,fr-be;q=0.3
        Accept-Encoding: gzip,deflate
        Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
        Keep-Alive: 300
        Connection: keep-alive
        Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961
        Content-Length: 135361
        
        -----------------------------886261531333586100294758961
        Content-Disposition: form-data; name=""; filename="IMG_1132.jpg"
        Content-Type: image/jpeg
        
        (data starts here and ends with -----------------------------886261531333586100294758961 )
        

        你在头部有Content-Length,另外在文件部分的头部有Content-Type(每个文件都有自己的头部,这是多部分编码的目的)。请注意,通过猜测文件类型来设置相关的 Content-Type 是浏览器的责任;你不能保证它,但它应该是相当可靠的早期拒绝(但你最好在它完全可用时检查整个文件)。

        现在,有一个问题。我曾经像这样过滤图像文件,不是在大小上,而是在 content-type 上;但是当您想尽快停止请求时,就会出现同样的问题:浏览器只有在整个请求发送后才会收到您的响应,包括表单内容和上传的文件

        如果你不想要提供的内容并停止上传,你别无选择,只能粗暴地关闭套接字。用户只会看到一条令人困惑的“对等连接重置”消息。这很糟糕,但这是设计使然。

        因此,您只想在后台异步检查的情况下使用此方法(使用检查文件字段的计时器)。所以我有那个黑客:

        • 我使用 jquery 告诉我文件字段是否已更改
        • 选择新文件后,禁用同一表单上的所有其他文件字段以仅获取该文件。
        • 异步发送文件(jQuery可以为你做,它使用隐藏框架)
        • 服务器端,检查头部(内容长度,内容类型,...),一旦你得到你需要的就切断连接。
        • 设置一个会话变量,告知该文件是否正常。
        • 客户端,当文件上传到框架时如果连接关闭,您甚至不会收到任何反馈。您唯一的选择是计时器。
        • 客户端,计时器轮询服务器以获取上传文件的状态。服务器端,您已设置会话变量,将其发送回浏览器。
        • 客户端有状态码;将其呈现为您的表单:错误消息,绿色复选标记/红色 X 等等。重置文件字段或禁用表单,由您决定。不要忘记重新启用其他文件字段。

        很乱,嗯?如果你们有更好的选择,我会全力以赴。

        【讨论】:

          猜你喜欢
          • 2014-04-04
          • 1970-01-01
          • 2017-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          相关资源
          最近更新 更多