如何在不传输整个文件的情况下限制使用 JavaScript(或 Java)上传的文件的大小?
Posted
技术标签:
【中文标题】如何在不传输整个文件的情况下限制使用 JavaScript(或 Java)上传的文件的大小?【英文标题】:How do you restrict the size of a file being uploaded with JavaScript (or Java) without transferring the entire file? 【发布时间】:2010-09-14 13:29:28 【问题描述】:有没有办法在客户端浏览器上验证从 JSP 页面上传的文件的大小是否超过了设定的大小限制,而不会强制用户上传整个文件才发现它太大了?
如果可能,我希望远离任何专有控件或技术,例如 Flash 或 ActiveX。
谢谢!
【问题讨论】:
【参考方案1】:这不是一个完美的解决方案,但如果您使用request.getHeader("Content-Length")
检查 Content-Length HTTP 标头,那么您可以选择不传输整个文件。
作为解释,一个非常大的文件不会一次全部传输。您实际上必须打开一个表示该 POST 数据块的流并从中读取整个要传输的数据。
另一方面,如果您担心拒绝服务攻击,那么您就不能真正信任 Content-Length 标头,因为它很容易被伪造。在这种情况下,您应该设置一个限制并流式传输此文件,一旦超过该限制就停止。
【讨论】:
【参考方案2】:建议您重新考虑 Flash 决定并查看 YUI 上传器,此处:
http://developer.yahoo.com/yui/uploader/
除其他外,fileSelect 事件会在文件被选中后上传之前立即告诉您所选文件的大小(以字节为单位),因此您可以进行相应的限制。
【讨论】:
【参考方案3】:使用 JSP 或 php,您将无法限制文件大小,因为您的页面在上传完成之前不会收到请求。此时您可以决定不保存文件,但可能为时已晚。
有一些 Java 解决方案,例如MyUploader 或 Hermes。有些甚至支持多文件上传和恢复部分上传,有些还给你源代码。您也可以自己编写,但它需要是一个签名的小程序才能运行,因为它需要访问本地文件系统。如果您使用 Apache 作为您的网络服务器,则您的计算机中需要足够的 RAM 以适应在给定时间上传的所有文件的内存中的整个文件大小。
【讨论】:
以上是关于如何在不传输整个文件的情况下限制使用 JavaScript(或 Java)上传的文件的大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)
如何在不将文件保存在本地存储上的情况下将对象传输到 Azure Blob 存储?