Servlet 3.0 から導入された multipart 関連の処理を Tomcat で有効にする術について
servlet 3.0 の multipart 関連処理を有効にする方法 - blog.64p.org
これの関連なんですが.
こういう設定をしておかないと,HttpServletRequest#getPart() や HttpServletRequest#getParts() が null を返してきてマジ意味わからん!!!! みたいな感じのキレるが発生いたします.
ところで,Tomcat で multipart 関連の処理を有効にする方法としては
1. web.xml
に設定を書く
2. Servlet クラスに対して @MultipartConfig
アノテーションで設定する
3. context.xml
か Tomcat/conf/server.xml
に設定を書く
の3つがあるようです.
1の方法は上のtokuhiromさんのエントリにあるように書いてやれば良いです.
<servlet> <multipart-config> <location>/tmp</location> <!-- ディレクトリパスを指定することも出来る (しなくても良い) --> <max-file-size>5242880</max-file-size> <max-request-size>27262976</max-request-size> <file-size-threshold>32768</file-size-threshold> </multipart-config> </servlet>
2の方法は Servlet クラスに @MultipartConfig
アノテーションで設定を書いてやるというものです.
@MultipartConfig( location="/tmp", // ディレクトリパスを指定することも出来る (しなくても良い) fileSizeThreshold=32768, maxFileSize=5242880, maxRequestSize=27262976 )
フームという感じです.
3の方法は webapp/META-INF/config.xml
や Tomcat/conf/server.xml
に以下の様な設定を書くという感じのやつです.
<Context ... allowCasualMultipartParsing="true" />
どれが best-way なのか,という話題ですが,まあアノテーションを使う方法2はちょっと無いですねという感じです.だるいですし,そもそもミドルウェアの関心事がアプリケーションのコードに記述されるというのは厳しい心境になります.
残る方法は1と3ですが,これはまあどちらでも良いのではという感じはあります.
web.xml
はアプリケーションの定義を書く xml ですが,まあ multipart の設定を書く程度なら妥当な感じはします (ただ,ディレクトリパスをハードコードで指定したりすると厳しいのではという意識があります).
config.xml
やserver.xml
に書くのは適切な感じがします.が,web.xml
や @MultipartConfig
アノテーションで出来るような細かな設定が出来ないのでびみょい場合はあると思います.
ここらへんは適宜使い分けていくという感じでしょうか.
参考