3

Tomahawk inputFileUpload コンポーネントを使用して、ユーザーがサーバーにファイルをアップロードできるようにしています。アップロード後にファイルのサイズをチェックし、大きすぎる場合はエラーを表示することで、「ソフト」ファイル サイズ制限を実装しました。ただし、制限を超えるとアップロードがすぐに停止する、より大きな「ハード」制限も必要です。たとえば、ハード リミットが 500MB で、ユーザーが 2GB のファイルをアップロードしようとすると、500MB がアップロードされるとすぐにアップロードが停止し、エラーが表示されます。

MyFaces ExtensionsFilter を使用し、uploadMaxFileSize を設定することで問題が解決することを期待していましたが、SizeLimitExceededException がスローされる前にファイルが完全にアップロードされました。

これを行うことは可能ですか?理想的には、トマホークを引き続き使用できますが、他の解決策があればよいでしょう。

4

2 に答える 2

9

Web サーバーは、HTTP 要求を途中で中止して HTTP 応答を返すことはできません。HTTP 応答が返される前に、HTTP 要求全体を最後のビットまで完全に消費する必要があります。それが HTTP と TCP/IP の性質です。サーバー側のプログラミング言語でそれに対してできることは何もありません。

Tomahawk ファイル アップロードのサイズ制限は、サイズ制限に達するたびにサーバーのメモリ/ディスク スペースがアップロードされたファイル全体で汚染されないように既に注意を払っています。

最善の策は、アップロードが行われる前に JavaScript でファイルの長さを検証することです。これは、 HTML5 APIをサポートするブラウザーでサポートされています。FileFirefox、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.
    }
}
于 2012-05-09T01:47:50.847 に答える
2

これを試して:

<div>
    <p:fileUpload id="fileUpload" name="fileUpload" value="#{controller.file}" mode="simple" rendered="true"/>
    <input type="button" value="Try it" onclick="checkFileSize('fileUpload')" />

</div>

ユーザーが [試してみる] ボタンをクリックすると、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に基づいています。

テストしたバージョン:

プライムフェイス3.5

jsf2.1

于 2014-02-27T22:59:00.420 に答える