2012-05-09 141 views
0

TomahawkのinputFileUploadコンポーネントを使用して、ユーザーがファイルをサーバーにアップロードできるようにしています。私はアップロードされたファイルのサイズをチェックし、ファイルが大きすぎる場合はエラーを表示することにより、ファイルサイズの制限を「ソフト」に設定しました。しかし、私はまた、一度それが限界を過ぎてすぐにアップロードが停止するより大きい "ハード"制限が欲しいと思います。たとえば、ハードリミットが500MBで、ユーザーが2GBファイルをアップロードしようとすると、500MBがアップロードされてエラーが表示されるとすぐにアップロードが停止します。JSFのファイルアップロードサイズを制限する

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

これは可能ですか?理想的には、私はまだTomahawkを使うことができるだろうが、他の解決策は良いだろう。

答えて

5

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

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

アップロードする前に、JavaScriptでファイルの長さを検証することをお勧めします。これは、ブラウザsupporting HTML5 File APIでサポートされています。現在のバージョンのFirefox、Chrome、Safari、Opera、Androidはそれをサポートしています。 IE9はまだそれをサポートしていません、それは将来のIE10になるでしょう。この

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. 
    } 
} 
+0

がアップロードを停止する方法に関係なく、利用者に返却されているものの、ありますか? IE9を使用しているユーザーが大量のファイルをアップロードできるようになり、唯一の選択肢は、すぐに削除する前にすべてを受け入れることです。 – jwaddell

+0

説明したように、方法はありません。そして、言い換えれば、サイズ制限を超過すると、読み取り要求バイトは無視されます。これはサーバのメモリ/ディスク容量には影響しません。 – BalusC

+0

@ BalusC..このアプローチはPrimefacesファイルのアップロードで機能しますか? – SRy

0

のようなもので

<t:inputFileUpload ... onchange="checkFileSize(this)" /> 

これを試してみてください:

<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を()関数が呼び出され、ファイルアップロードコンポーネントを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

関連する問題