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

久々のエントリです。

過去のエントリで

あと、セキュリティ面からアップロードファイルのサイズ制限などの設定は必須ですが、アノテーションでしか指定出来ないのは困ります。

今回調査したJSFのように、既存フレームワークとの連携が非常にやりにくくなりますし、サイズ制限が異なるだけの処理にわざわざServletを個別に作らなければいけません。

例えばweb.xmlでも設定出来るようにする、などの逃げ道がほしかったです。

http://d.hatena.ne.jp/jabaraster/20110330/1301466968

などと書いていましたが、ちょっと気になって調べてみたらweb.xmlでも設定出来ることが分かりました。

web.xmlでアップロードファイルの最大サイズを指定する

  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>sandbox.server.UploadServlet</servlet-class>
    <multipart-config>
      <location>/tmp</location>
      <max-file-size>1</max-file-size>
      <max-request-size>10</max-request-size>
      <file-size-threshold>1</file-size-threshold>
    </multipart-config>
  </servlet>

そのまますぎです。
なんでもっと早く調べなかったのか。

コードからアップロードファイルの最大サイズを指定する

Servlet3.0ではweb.xmlで設定出来ることの多く(全て?)がコードからも設定可能です。
ということは、アップロードファイルの最大サイズももしかして・・・と調べたらやっぱり出来ました。

例えばこんな↓感じです。

@WebListener
public class ServletRegisterer implements ServletContextListener {

    @Override
    public void contextDestroyed(final ServletContextEvent pSce) {
        //
    }

    @Override
    public void contextInitialized(final ServletContextEvent pSce) {
        final ServletContext ctx = pSce.getServletContext();
        final Dynamic d1 = ctx.addServlet("upload1", UploadServlet.class);
        d1.addMapping("/upload1");
        d1.setMultipartConfig(new MultipartConfigElement("", 1, 20, 0));
    }
}

maxFileSizeが効かない

今回の調査の過程maxFileSizeが効かないという現象に会っています。
なんでかな・・・
なんか設定の仕方をかんちがいしているのかもしれません。

Javadocに物申す

maxFileSizeが効かないので設定の仕方を確認するためにJavadocを確認しに行ったのですが、数値の単位が書いていません。
たぶんKBやMBではなくバイトを指定するっぽいのですが「Javadocに書いといてくれればいいのに!」と思わずにはいられません。
不親切だなぁ。