我正在使用Tomahawk inputFileUpload组件来允许用户将文件上传到服务器。我通过在上传文件后检查文件大小来实现“软”文件大小限制,如果文件太大则显示错误。但是我还想要一个更大的“硬”限制,一旦超过限制,上传会立即停止。例如,如果硬限制为500MB且用户尝试上传2GB文件,则一旦上传500MB并且显示错误,上传将立即停止。
我曾希望使用MyFaces ExtensionsFilter并设置uploadMaxFileSize可以解决问题,但文件在抛出SizeLimitExceededException之前已完全上传。
有可能这样做吗?理想情况下,我仍然可以使用Tomahawk,但任何其他解决方案都会很好。
答案 0 :(得分:6)
Web服务器无法中途中止HTTP请求,然后返回HTTP响应。必须完全使用整个HTTP请求,直到可以返回HTTP响应之前的最后一位。这就是HTTP和TCP / IP的本质。使用服务器端编程语言无法对付它。
请注意,Tomahawk文件上传大小限制已经注意到,只要达到大小限制,服务器的内存/磁盘空间就不会被整个上传文件污染。
最好的办法是在上传之前用JavaScript验证文件长度。浏览器supporting HTML5 File
API支持此功能。当前版本的Firefox,Chrome,Safari,Opera和Android都支持它。 IE9还不支持它,它将来是IE10。
<t:inputFileUpload ... onchange="checkFileSize(this)" />
有这样的东西
function checkFileSize(inputFile) {
var max = 500 * 1024 * 1024; // 500MB
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.
}
}
答案 1 :(得分:0)
试试这个:
<div>
<p:fileUpload id="fileUpload" name="fileUpload" value="#{controller.file}" mode="simple" rendered="true"/>
<input type="button" value="Try it" onclick="checkFileSize('fileUpload')" />
</div>
当用户单击“Try it”按钮时,将调用checkFileSize()函数并验证fileUpload primefaces组件。如果文件大小超过500MB,则不上载文件。
<script>
// <![CDATA[
function checkFileSize(name) {
var max = 500 * 1024 * 1024; // 500MB
var inputFile = document.getElementsByName(name)[0];
var inputFiles = inputFile.files;
if (inputFiles.lenght > 0 && inputFiles[0].size > max) {
alert("File too large."); // Do your thing to handle the error.
inputFile.value = null; // Clears the field.
}
}
// ]]>
</script>
checkFileSize()逻辑基于上面回答的BalusC。
测试的版本:
primefaces 3.5
jsf 2.1