概要
Spring MVCにてファイルのフォーム部品を扱う基本的な方法についてまとめた。
画面からファイル情報を送信するにはMultipartFileオブジェクトを使する。
前提
以下の記事の続きとなる。
概要 Spring MVCにてさまざまなフォーム部品を扱う方法についてまとめた。 テキストボックス、ラジオボタン、チェックボックスなどを画面表示⇒POST送信⇒取得する方法について紹介する。 前提 Mavenプロ[…]
ファイルアップロード設定
ファイルを扱うためには、Spring MVC で Servlet 3.0 以降の組み込みのマルチパート解析機能(StandardServletMultipartResolver )を使用する。
この機能を使用するには以下の流れで実装する。
②web.xmlにファイルアップロードまわりの設定
Bean定義
StandardServletMultipartResolverをDIコンテナに登録するため、Bean定義ファイルに設定を追加する。
springMVCContext.xml
<!-- ファイルアップロード -->
<!-- Spring3.0以降で使用できるBean -->
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />
web.xml
ファイルアップロードまわりの設定を行う。
web.xml
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/META-INF/spring/springMVCContext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- ファイルアップロードに関する設定 -->
<multipart-config>
<!-- アップロードされるファイルの最大サイズ -->
<max-file-size>10485760</max-file-size> <!-- ここでは10MB -->
<!-- リクエスト全体の最大サイズ -->
<max-request-size>20971520</max-request-size> <!-- ここでは20MB -->
<!-- ファイルがディスクに一時保存されるサイズのしきい値 -->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
もともと定義しているDispatcherServletの設定に、<multipart-config>タグで囲まれた設定を追加する。
ファイルアップロードの使用
StandardServletMultipartResolverまわりの設定を行うことでファイルアップロード機能が使用可能となる。
フォーム
画面から送られてきたファイル情報を取得するため、MultipartFile型のフィールドを定義する。
FooForm.java
// ファイル
private MultipartFile file;
画面
フォームタグにファイル送信用の設定を追加する。
input.jsp
<form:form modelAttribute="fooForm" class="mt-4" enctype="multipart/form-data">
上記を追加することで、ファイルをフォーム送信できる。
input.jsp
<tr>
<th class="col-3">ファイル</th>
<td class="col-7">
<input type="file" name="file" />
</td>
</tr>
フォームのファイル送信部品。
コントローラー
フォームオブジェクトから取得したMultipartFileは、例えば以下のように使用できる。
FooController.java
var file = form.getFile();
// ファイル名
var fileName = file.getOriginalFilename();
// ファイルサイズ
var size = file.getSize();
// コンテンツタイプ
var contentType = file.getContentType();