在Jersey中限制上传文件大小的过滤器
我有一个HTML表单,它会将文件(包括其他表单域)上传到我的服务器。 在那里,我使用Java和Jersey,并创建了一个过滤器,如果文件大(> 10MB),将会抛出异常。 但我似乎无法让浏览器在我抛出异常时立即停止文件上传。 我可以看到,从服务器端读取InputStream后停止10MB,但浏览器仍然会继续上传文件直到完成。 只有这样才会显示错误。
HTTP和浏览器的工作方式有什么妨碍它的工作吗?
如果用户在得到错误之前必须等待while文件上传,则用户体验会变得更糟。
这是我正在使用的泽西岛过滤器。 这似乎是在服务器端正常运行,所以问题似乎与浏览器。
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后出现错误...
这是因为浏览器在发送完整请求之后才会查找服务器响应。
以下是阻止大文件上传到达服务器之前的两种方法:
1)客户端脚本。 一个小程序(Java文件上传)或浏览器插件(Flash文件上传,ActiveX或其他)可以检查文件的大小,并将其与您声明的限制进行比较(您可以使用OPTIONS请求进行此操作或只需将表单中允许的最大大小作为文件输入元素的隐藏输入或非标准属性)。
2)使用允许直接从浏览器上传的第三方数据服务,例如Amazon S3。 在页面上设置表单,以便将其上传到数据服务,并在成功调用您编写的一些JavaScript函数时通知您的服务器关于可用文件上传(包含实例详细信息)。 然后,您的服务器向数据服务发送一个请求,以查明文件的大小......如果它足够小,您可以从服务器端检索它。 如果它太大,您只需向数据服务发送删除请求,然后将您的响应发送到浏览器(您的javascript函数),该文件太大,需要重新执行。 您的JavaScript功能会影响显示以通知用户。
链接地址: http://www.djcxy.com/p/91551.html上一篇: Filter for limiting the file size on upload in Jersey
下一篇: Setting file size restrictions when uploading files with Jersey