3

使用 Tomcat 6,我使用 apache commons FileUpload 来允许图像上传。我可以使用 setSizeMax 和 setFileSizeMax 设置最大文件。但似乎上传了整个大文件,然后检查它是否太大。根据另一篇文章,似乎 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 进行大量上传,因为上传图像等对于网络应用程序来说是一项非常常见的任务。

4

2 回答 2

1

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

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

于 2012-05-26T01:18:49.533 回答
0

Tomcat 的 HTTP 连接器有一个 maxPostSize 属性。请参阅Tomcat 文档

编辑:太糟糕了,这不适用于多部分/表单数据。您是否考虑过使用签名的 Applet 或使用“Java Web Start”来管理上传?

于 2012-05-26T05:00:22.600 回答