その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

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.xmlTomcat/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.xmlTomcat/conf/server.xml に以下の様な設定を書くという感じのやつです.

<Context
    ...
    allowCasualMultipartParsing="true" />


どれが best-way なのか,という話題ですが,まあアノテーションを使う方法2はちょっと無いですねという感じです.だるいですし,そもそもミドルウェアの関心事がアプリケーションのコードに記述されるというのは厳しい心境になります.

残る方法は1と3ですが,これはまあどちらでも良いのではという感じはあります.
web.xml はアプリケーションの定義を書く xml ですが,まあ multipart の設定を書く程度なら妥当な感じはします (ただ,ディレクトリパスをハードコードで指定したりすると厳しいのではという意識があります).
config.xmlserver.xml に書くのは適切な感じがします.が,web.xml@MultipartConfig アノテーションで出来るような細かな設定が出来ないのでびみょい場合はあると思います.

ここらへんは適宜使い分けていくという感じでしょうか.


参考