【发布时间】:2012-06-01 12:46:30
【问题描述】:
使用 Tomcat 6,我使用 apache commons FileUpload 来允许图像上传。我可以使用 setSizeMax 和 setFileSizeMax 设置最大文件。但似乎上传了整个大文件,然后检查它是否太大。根据另一个post,似乎 setSizeMax 应该切断上传,但这不是我得到的行为。
为了测试这一点,我将 sizeMax 和 fieSizeMax 设置得很低,并上传了一个相当大的文件。上传大文件需要 15 秒,而不是几乎瞬间将其切断。
有什么想法吗?这是一些代码,带有简化的异常子句。
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(30);
upload.setSizeMax(28);
List items = null;
try {
items = upload.parseRequest(request);
} catch (Exception e) {
out.println("exceeded max file size..");
return;
}
更多信息:使用 tomcat 6. 设置 maxPostSize 不适用于内容类型:multipart/form-data。此外,再次检查请求内容长度需要上传整个文件。最后,使用 FileUpload 的 steaming api 似乎也不起作用,因为它似乎再次要求在关闭流之前上传整个文件;即使 servlet 没有将字节写入磁盘,上传也会继续。必须有一种方法可以防止使用 tomcat 6 进行大量上传,因为上传图片等对于网络应用来说是一项非常常见的任务。
【问题讨论】:
-
如果您可以要求您的用户使用兼容 HTML5 的浏览器,那么您可以在客户端进行验证。见*.com/questions/4112575/…
-
@rickz - 依靠客户端检查/验证来保护服务器端绝不是一个好主意。颠覆支票太容易了。
-
@StephenC 这不会带来安全风险。这只是提高 Web 应用程序性能的一种努力。如果客户端验证失败,那么服务器总是可以拒绝上传。
-
@rickz - 我的印象是 OP 正试图保护整体系统性能免受下载巨大文件的人的影响。这是一个拒绝服务问题,不难想象有人故意这样做......
-
@rickz - “如果客户端验证失败,那么服务器总是可以拒绝上传。”。另一方面,如果(被破坏的)客户端跳过验证并告诉服务器“没问题”,那么服务器就会收到不好的东西。人们一直在做这种事情,假装不这样是愚蠢的。
标签: java apache servlets file-upload size