在JSF中限制文件上载大小

时间:2012-05-09 00:50:14

标签: jsf file-upload tomahawk

我正在使用Tomahawk inputFileUpload组件来允许用户将文件上传到服务器。我通过在上传文件后检查文件大小来实现“软”文件大小限制,如果文件太大则显示错误。但是我还想要一个更大的“硬”​​限制,一旦超过限制,上传会立即停止。例如,如果硬限制为500MB且用户尝试上传2GB文件,则一旦上传500MB并且显示错误,上传将立即停止。

我曾希望使用MyFaces ExtensionsFilter并设置uploadMaxFileSize可以解决问题,但文件在抛出SizeLimitExceededException之前已完全上传。

有可能这样做吗?理想情况下,我仍然可以使用Tomahawk,但任何其他解决方案都会很好。

2 个答案:

答案 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