将文件上传到服务器时,Web浏览器是否会在http标头中发送文件大小?如果是这种情况,那么,是否可以通过读取标题来拒绝文件,而不是等待整个上传过程完成?
答案 0 :(得分:11)
http://www.faqs.org/rfcs/rfc1867.html
HTTP客户端 鼓励为整体文件输入提供内容长度,以便a 繁忙的服务器可以检测建议的文件数据是否太大 合理处理
但内容长度不是必需的,所以你不能依赖它。此外,攻击者可能会伪造错误的内容长度。
读取文件内容是唯一可靠的方法。话虽如此,如果内容长度存在且太大,关闭连接将是一件合理的事情。
此外,内容以multipart形式发送,因此大多数现代框架首先对其进行解码。这意味着在框架完成之前你不会得到文件字节流,这可能意味着“直到整个文件被上传”。
答案 1 :(得分:2)
编辑:在走得太远之前,您可能想要依靠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;你不能保证它,但它应该是相当可靠的早期拒绝(但你最好在完全可用时检查整个文件)。
现在,有一个问题。我曾经过滤过这样的图像文件,不是大小,而是内容类型;但是,如果您想尽快停止请求,则会出现同样的问题:浏览器只会在发送完整个请求后收到您的回复,包括表单内容和上传的文件。
如果您不想要提供的内容并停止上传,您别无选择,只能粗暴地关闭套接字。用户只会看到令人困惑的“通过对等方重置连接”消息。这很糟糕,但它是设计的。
因此,您只想在后台异步检查的情况下使用此方法(使用检查文件字段的计时器)。所以我有那个黑客:
相当混乱,是吗?如果你们中有人有更好的选择,我会全力以赴。
答案 2 :(得分:1)
我不确定,但您不应该真正信任标题中发送的任何内容,因为它可能会被用户伪造。
这取决于服务器的工作方式。例如,在PHP中,您的脚本在文件上传完成之前不会运行,因此这是不可能的。