apache commons FileUpload - 在整个文件上传之前切断大文件

时间:2012-05-26 00:50:14

标签: java apache servlets file-upload size

使用Tomcat 6,我使用apache commons FileUpload来允许图片上传。我可以使用setSizeMax和setFileSizeMax设置max文件。但似乎上传了整个大文件,然后检查它是否太大了。根据另一个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不适用于content-type:multipart / form-data。此外,再次检查请求内容长度需要上载整个文件。最后,使用FileUpload的steaming api似乎也不起作用,因为它似乎再次要求在关闭流之前上传整个文件;即使servlet没有将字节写入磁盘,上传仍将继续。必须有一种方法来防止使用tomcat 6进行大量上传,因为上传图像等对于网络应用来说是一项非常常见的任务。

2 个答案:

答案 0 :(得分:1)

无论您是否将它们保存在服务器上,客户端都会发送这些位。服务器无法告诉客户端停止发送不强行关闭输入流的位(因为HTTP的性质:响应跟随请求 - 它们不是同时发生的)。您可以尝试这样做,但是当您执行close()时,大多数应用程序服务器都会从客户端中消耗输入流,因此不会发生任何变化。

如果您可以控制客户端并要求使用100-Continue(通过Expect标头),您可以窥探请求的Content-Length并通过发送否定回复而不是100-Continue来拒绝它

答案 1 :(得分:0)

Tomcat的HTTP连接器具有maxPostSize属性。见Tomcat docs

编辑:太糟糕,不适用于multipart / form-data。您是否考虑过使用已签名的Applet或使用“Java Web Start”来管理上传?