私はGrails/Groovy Webアプリを実装しています。ユーザーのファイルアップロードサイズを制限したいのですが、誰かが10GBのファイルをサーバーにアップロードしたくありません。サイズを計算するほとんどのアプローチはファイルがすでにアップロードされた後に行われると私が理解したのは、誰かが10個のプロファイルを作成し、10 GBのサイズのファイルを10個アップロードするとどうなるかです。これはサーバーを使い果たし、サーバーのディスク上に多くのスペースを占める可能性があります。だから私はこれを防ごうとしています。
私は、Apache Tomcatが次の構成を可能にすることを理解しました。 max-file-sizeがアップロードプロセス中に計算されるのか、ファイルが一時的な場所にアップロードされた後に計算されるのかわかりません。ドキュメントは次のことを示しています。
@MultipartConfigアノテーションは、次のオプション属性をサポートしています。
location:ファイルシステム上のディレクトリへの絶対パス。 location属性は、アプリケーションコンテキストに対する相対パスをサポートしていません。この場所は、パーツの処理中、またはファイルのサイズが指定されたfileSizeThreshold設定を超えたときに、ファイルを一時的に保存するために使用されます。デフォルトの場所は「」です。
fileSizeThreshold:ファイルがディスクに一時的に保存されるまでのファイルサイズ(バイト単位)。デフォルトのサイズは0バイトです。
MaxFileSize:アップロードされたファイルに許可される最大サイズ(バイト単位)。アップロードされたファイルのサイズがこのサイズより大きい場合、Webコンテナーは例外(IllegalStateException)をスローします。デフォルトのサイズは無制限です。
maxRequestSize:multipart/form-dataリクエストに許可される最大サイズ(バイト単位)。アップロードされたすべてのファイルの全体的なサイズがこのしきい値を超えると、Webコンテナは例外をスローします。デフォルトのサイズは無制限です。
アノテーションアプローチ:
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
そしてこれがハードコードされた値です:
<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
アップロードプロセス中にMaxFileSizeが計算されるかどうかを誰かが明確にできるとありがたいです。
MaxFileSizeは、ファイル全体がすでにアップロードされた後で計算されます。 Webアプリにファイル(1GBサイズ)をアップロードすると、実際に何が起こるかがわかります。したがって、Tomcatに依存しても意味がありません。サーブレットで同じ作業を行うことは可能ですが、カウンターがMaxFileSizeに達したときに、基になるHTTP接続を切断するにはどうすればよいでしょうか。あなたには方法がないと思います。 HTTPプロトコルは単方向であるため、ブラウザに長い時間をキャンセルするように指示することもできません。あなたができる唯一のことは、カウンターがしきい値に達したときに、ファイル転送が完了するまでディスクスペースを保護するために、入力ストリームからのフォローアップバイトを無視することです。