■応用の森 Spring-MVCによる、ファイルアップロード処理と例外処理 |
ファイルアップロードの最大ファイルサイズ指定の例外処理で大分はまってしまったので 備忘録として解説しておきます。 まず、ファイルアップロード画面のHTMLです。 ファイルを選択して、「ファイルアップロード」ボタンをクリックすると アップロード処理ハンドラ「upload.xhtml」を実行します。 view (showupload.html) |
次に、Spring設定ファイル (applicationContext.xml) でアップロードファイルサイズを指定します。 以下の設定を追加する(maxUploadSizeは適宜修正する事)。 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- ファイルアップロードの最大サイズ(byte単位)を指定する (-1:制限なしはNG)--> <property name="maxUploadSize" value="10240"/> </bean> |
■ファイルのアップロード例外処理 ネットでよく見かける、HandlerExceptionResolverをimplementsしたアップロードクラスが紹介されていますが、 実際この方式で試してみたところ、まともに動きませんでした。 ファイルアップロード画面のURL /fileupload.xhtml をたたいてみると、画面が表示されずに いきなりエラー画面に飛んでしまいます。 コントローラは以下の様な割と単純なコードのJavaクラスです。 FileUpload.java 実行結果のログを確認すると、以下の様なログしか出力されません。 INFO - ==jp.dip.arimodoki.cntl.FileUpload:resolveException() Enter INFO - ==jp.dip.arimodoki.cntl.FileUpload:resolveException() Leave |
だいぶあれこれ試行錯誤しましたが解決しなかったので HandlerExceptionResolverクラスを独立させる方式で試した結果なんとか解決したので、 これが正解かどうかはわかりませんが、以下解決方法を説明しておきます。 上のFileUpload.javaから、HandlerExceptionResolverを取り外した単純なコントローラにします。 FileUpload2.java |
次に、HandlerExceptionResolverを独立させたクラスを作成します。 これは、コントローラではなく汎用的なクラスとします。 @Controllerアノテーションは付けない。 GlobalExceptionResolver.java クラスに@Componentアノテーションを宣言することで、 このクラスがDIコンテナに自動的に登録され使用可能となります。 |
これで実行した結果、期待通りの動きとなりました。 やれやれ。 |
Spring-MVCの小技集 ![]() |
ファイルアップロード処理 |