0 java jsf file-upload apache-commons apache-commons-fileupload
我有一个在 JBoss 6.1 中运行的 JSF 应用程序,它使用内部的 Tomcat Servlet 容器。
我已经实现了使用 apache commons 文件上传的上传。我想防止上传过大的文件,并
fileSizeMax在类中将该属性设置为 10MB FileUploadBase。它有效,文件上传会FileSizeLimitExceededException为所有大于 10MB的文件抛出一个。此异常会在不到一秒的时间内引发。但主要问题是,整个文件将通过网络传输。我通过检查网络流量发现了这一点。之后重定向到错误页面完成。
如何在超过最大大小时中断文件传输而不传输整个文件?我假设由于 web 表单属性,文件将在多个包中传输enctype
="multipart/form-data"。
您不能中止 HTTP 请求。如果这样做,您将无法返回 HTTP 响应,并且客户端最终将没有任何形式的反馈,期望可能是特定于浏览器的“对等连接重置”错误页面。
最好的办法是事先在 JavaScript 中验证它。顺便说一下,这只适用于支持 HTML5 FileAPI 的浏览器。您没有说明您使用的是哪个 JSF 文件上传组件,所以我的印象是您只是自制了一个,所以我将给出一个适用于呈现的 HTML 的通用答案<input type="file">(请注意,它同样有效)在例如Tomahawk 的<t:inputFileUpload>) 上:
<input type="file" ... onchange="checkFileSize(this)" />
Run Code Online (Sandbox Code Playgroud)
像这样的东西
function checkFileSize(inputFile) {
var max = 10 * 1024 * 1024; // 10MB
if (inputFile.files && inputFile.files[0].size > max) {
alert("File too large."); // Do your thing to handle the error.
inputFile.value = null; // Clears the field.
}
}
Run Code Online (Sandbox Code Playgroud)
如果旧浏览器不支持这一点,那么你就迷路了。您最好的选择是 Flash 或 Applet。