我有一个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之后抛出错误...
答案 0 :(得分:2)
这是因为浏览器在发送完整请求之后才会查找服务器响应。
以下是两种在文件上传到服务器之前停止上传的方法:
1)客户端脚本。小程序(Java文件上载)或浏览器插件(Flash文件上载,ActiveX或其他)可以检查文件的大小,并将其与您声明的限制进行比较(您可以使用OPTIONS请求或只需在表单中包含允许的最大大小,作为文件输入元素的隐藏输入或非标准属性。)
2)使用Amazon S3等第三方数据服务,允许直接从浏览器上传。在页面上设置表单,以便上传到数据服务,并在成功时调用您编写的一些javascript函数,通知您的服务器有关可用文件上载(具有实例详细信息)。然后,您的服务器向数据服务发送请求以查找文件的大小...如果它足够小,您可以从服务器端检索它。如果它太大,您只需向数据服务发送删除请求,然后将您的响应发送到浏览器(您的javascript函数),该文件太大,他们需要再次执行此操作。然后,您的javascript函数会影响显示以通知用户。