【发布时间】: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