【发布时间】:2011-05-14 11:47:34
【问题描述】:
我有一个带有 FileUpload 控件的表单,用户可以在其中上传图片。能否保证上传图片的文件大小在上传前小于配置的maxRequestLength,从而防止文件过大时抛出异常?
我最初尝试查看控件的 PostedFile 的 ContentLength 无济于事,因为文件已经提交。
我没有兴趣增加 maxRequestLength。
【问题讨论】:
我有一个带有 FileUpload 控件的表单,用户可以在其中上传图片。能否保证上传图片的文件大小在上传前小于配置的maxRequestLength,从而防止文件过大时抛出异常?
我最初尝试查看控件的 PostedFile 的 ContentLength 无济于事,因为文件已经提交。
我没有兴趣增加 maxRequestLength。
【问题讨论】:
甚至可以在上传的文件完全传输之前确定正在上传的文件的大小。即使使用 Internet Explorer。通过使用 HTTP 的内容长度标头!
在 Java 世界中:
首先,如果您处理在第一个 servlet/filter/controller 中到达服务器的请求,在任何先前的线程质量之前到达服务器,您将可以在 content-length 标头中获得总文件大小(request.获取内容长度())。
其次 - 看看证明它是可能的 ajax 实现:http://www.ajaxfilebrowser.com/
【讨论】:
听起来您有一个要求,“防止异常”,以及您认为应该实现该目标的方式,“检查客户端的文件大小”。
使用 Flash 或 Silverlight 等客户端技术,您只能 100% 在客户端验证文件大小。这可以防止异常,但会迫使您将自己绑定到特定的客户端技术。
您可以阻止该异常,但它确实在文件上传后发生(出于您之前所述的原因)。查看本文以获取代码示例:http://aspnetresources.com/articles/dark_side_of_file_uploads
类似的功能在 NeatUpload(开源,LGPL)等文件上传组件中提供了开箱即用的功能:http://www.brettle.com/NeatUpload-1.3/dotnet/docs/Manual.html -> 请参阅第 4.5 节。
【讨论】:
从可用性的角度来看,告诉人们不要使用的简单信息将大大有助于预防问题。
然后你可以试试这个(YMMV):这只是对浏览器的提示,并且取决于支持语法的浏览器。隐藏字段显然需要紧跟在您的文件输入之前(或者在 asp.net 中,您的文件上传控件,请检查浏览器中的标记以确保)。
<input type="hidden" name="MAX_FILE_SIZE" value="500" />
<input type="file" />
该值以 Kb 为单位 - 因此上述内容将限制为半兆字节。但是有些浏览器不支持这个,所以你仍然需要在服务器端检查它,或者接受一些使用奇怪/古老/不同浏览器的人可能仍然尝试提交超大文件。
【讨论】:
我只是认为这在 HTTP 的范围内是不可能的,我相信您将不得不为此使用 Flash 上传器。服务器知道文件大小的唯一方法是让服务器获取文件
查看http://www.swfupload.org 和http://demo.swfupload.org/v220/featuresdemo/index.php 的厨房水槽演示
【讨论】: