【问题标题】:Filter for limiting the file size on upload in Jersey用于限制泽西岛上传文件大小的过滤器
【发布时间】:2014-03-06 20:52:42
【问题描述】:

我有一个 HTML 表单,可以将文件(以及其他表单字段)上传到我的服务器。在那里,我使用 Java 和 Jersey,并创建了一个过滤器,如果文件太大(> 10MB),它将抛出异常。但是一旦我抛出异常,我似乎无法让浏览器停止文件上传。我可以看到从 InputStream 读取在服务器端 10MB 后停止,但浏览器仍会继续上传文件,直到完成。只有这样才会显示错误。

HTTP 和浏览器的工作方式是否存在阻止其工作的问题?

如果用户在收到错误之前必须等待 while 文件上传,用户体验会变得更差。

这是我正在使用的 Jersey 过滤器。这似乎在服务器端正常运行,因此问题似乎出在浏览器上。

import java.io.IOException;

import org.apache.commons.fileupload.util.LimitedInputStream;
import org.springframework.stereotype.Component;

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import com.sun.jersey.spi.container.ContainerResponseFilter;
import com.sun.jersey.spi.container.ResourceFilter;

@Component
public class SizeLimitFilter implements ResourceFilter, ContainerRequestFilter {

    @Override
    public ContainerRequest filter(final ContainerRequest request) {
        LimitedInputStream limitedInputStream = new LimitedInputStream(request.getEntityInputStream(), 1024 * 1024 * 10) {
            @Override
            protected void raiseError(final long pSizeMax, final long pCount) throws IOException {
                // Throw error here :)
            }
        };
        request.setEntityInputStream(limitedInputStream);
        return request;
    }

    @Override
    public ContainerRequestFilter getRequestFilter() {
        return this;
    }

    @Override
    public ContainerResponseFilter getResponseFilter() {
        return null;
    }
}

(是的,我知道上传文件(Javascript 函数)有更性感和现代的解决方案,但我需要使用适用于 IE7 的方法:/)

编辑:

澄清一下:一切正常,唯一的问题是我无法让浏览器在整个文件上传之前显示错误。因此,如果我尝试上传 200MB 的文件,则在上传整个文件之前不会显示错误,即使我的代码在 10MB 之后抛出错误...

【问题讨论】:

    标签: java file-upload jersey multipartform-data


    【解决方案1】:

    这是因为浏览器在发送完整请求之前不会寻找服务器响应。

    这里有两种方法可以在大文件到达您的服务器之前停止上传:

    1) 客户端脚本。小程序(Java 文件上传)或浏览器插件(Flash 文件上传、ActiveX 或其他)可以检查文件的大小并将其与您声明的限制进行比较(您可以为此使用 OPTIONS 请求或只需将表单中允许的最大大小作为隐藏输入或文件输入元素的非标准属性包含在内)。

    2) 使用第三方数据服务,例如允许直接从浏览器上传的 Amazon S3。在页面上设置表单,使其上传到数据服务,并在成功时调用您编写的一些 javascript 函数,通知您的服务器有关可用文件上传(带有实例详细信息)。然后,您的服务器向数据服务发送请求以找出文件的大小......如果它足够小,您可以从服务器端检索它。如果文件太大,您只需向数据服务发送删除请求,然后向浏览器(您的 javascript 函数)发送文件太大的响应,他们需要再次执行此操作。然后,您的 javascript 函数会影响显示以通知用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2018-12-02
      • 2014-10-06
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多