Apache Tomcat の最大ファイルアップロードサイズの設定

Apache Tomcat の最大ファイルアップロードサイズの設定

私は Grails/Groovy Web アプリを実装しています。ユーザーのファイル アップロード サイズを制限したいのですが、誰かが 10 GB のファイルをサーバーにアップロードするのは望ましくありません。サイズを計算するほとんどの方法は、ファイルがアップロードされた後に行われるということが分かりました。誰かが 10 個のプロファイルを作成し、10 GB ものファイルを 10 個アップロードしたらどうなるでしょうか。サーバーが使い果たされ、サーバー ディスクのスペースを大量に占有する可能性があります。そのため、これを防止しようとしています。

Apache Tomcat では、ハードコードまたはアノテーション アプローチで次の構成が可能であることが分かりました。最大ファイル サイズがアップロード プロセス中に計算されるのか、ファイルが一時的な場所にアップロードされた後に計算されるのかはわかりません。ドキュメントには次のように記載されています。

@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 がアップロード処理中に計算されるかどうかを明確にしていただけると幸いです。

答え1

MaxFileSize は、ファイル全体がアップロードされた後に計算されます。Web アプリにファイル (1GB サイズ) をアップロードすると、実際に何が起こるかがわかります。したがって、Tomcat に頼るのは意味がありません。サーブレットで同じ作業を行うことは可能ですが、カウンターが MaxFileSize に達したときに、基礎となる HTTP 接続を切断するにはどうすればよいでしょうか。方法はないと思います。HTTP プロトコルは一方向であるため、ブラウザーに長い投稿を時間内にキャンセルするように指示することもできません。カウンターがしきい値に達したときに、ファイル転送が完了するまでディスク領域を保護するために、入力ストリームからの後続のバイトを無視するだけです。

関連情報