Java ApacheCommonsFileUpload-在上传整个文件之前切断大文件

Java ApacheCommonsFileUpload-在上传整个文件之前切断大文件,java,apache,servlets,file-upload,size,Java,Apache,Servlets,File Upload,Size,使用Tomcat6,我使用ApacheCommonsFileUpload来允许图像上传。我可以使用setSizeMax和setFileSizeMax设置max文件。但似乎上传了一个完整的大文件,然后检查它是否太大。根据另一个说法,似乎setSizeMax应该切断上传,但这不是我得到的行为 为了测试这一点,我将sizeMax和fieSizeMax设置得非常低,并上传了一个相当大的文件。上传这个大文件花了15秒,而不是几乎在瞬间将其切断 有什么想法吗?下面是一些代码,带有一个简化的异常子句

使用Tomcat6,我使用ApacheCommonsFileUpload来允许图像上传。我可以使用setSizeMax和setFileSizeMax设置max文件。但似乎上传了一个完整的大文件,然后检查它是否太大。根据另一个说法,似乎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;
        }

更多信息:使用Tomcat6。设置maxPostSize不适用于内容类型:多部分/表单数据。此外,再次检查请求内容长度需要上传整个文件。最后,使用FileUpload的蒸汽api似乎也不起作用,因为它似乎再次要求在关闭流之前上载整个文件;即使servlet没有将字节写入磁盘,上传也将继续。必须有一种方法来防止使用tomcat 6进行大量上传,例如上传图像,这是web应用程序的一项非常常见的任务。

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


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

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


编辑:太糟糕了,这对多部分/表单数据不起作用。您是否考虑过使用已签名的小程序或“Java Web Start”来管理上载?

如果您可以要求用户使用兼容HTML5的浏览器,则可以在客户端进行验证。请参阅@rickz-依靠客户端检查/验证来保护服务器端从来都不是一个好主意。破坏这些检查太容易了。@StephenC这不会带来安全风险。这只是为了提高web应用程序的性能。如果客户端验证失败,那么服务器总是可以拒绝上传。@rickz-我得到的印象是,OP试图保护系统的整体性能不受下载大量文件的人的影响。这是一个拒绝服务的问题,不难想象有人故意这么做…@rickz-“如果客户端验证失败,那么服务器总是可以拒绝上传。”。另一方面,如果(被颠覆的)客户端跳过验证并告诉服务器“一切正常”,那么服务器就会收到坏消息。人们总是做这种事情,假装不这样做是愚蠢的。据我所知,request.getContentLength会等待整个文件上传。因此,一个巨大的文件仍将被完全上传,然后您可以运行该测试。这就是我得到的。maxPostSize不适用于内容类型多部分/表单数据。它仅适用于内容类型application/x-www-form-urlencoded。因此,设置maxPostSize对通过web表单上传图像等典型情况没有影响。在我的测试中,对于通常使用ApacheCommonsFileUpload的情况,maxPostSize完全被忽略。在以前的解决方案中,我使用了一个小程序来控制这类场景,但这是一个为更复杂的社区设计的应用程序。对于我当前项目的这一部分,要求用户只需上传图像即可。我认为一个签名的applet会让用户感到困惑。人们一直在开发网络应用来处理上传图像,所以必须有一个标准的方法。或者我应该选择另一种类型的服务器来处理上传?核心应用程序仍然是java的,但是我可以使用一个专用的VPS和另一种技术来上传吗?任何建议通常的选择是在Tomcat前面使用Apache Web服务器。它有LimitRequestBody指令。我自己没有经验。也许你需要问另一个问题才能找到Apache专家。