Picture

Hi, I'm ogaclejapan.

Android Software Engineer at AbemaTV

SpringMVCでのファイルアップロード

最近ファイルアップロードを使う機会があったので忘れぬうちにメモしておく。

主なポイントは3つ

  • CommonsMultipartResolverのDI定義を追加する
  • formタグにenctype属性を追加する
  • Controllerのメソッド引数にRequestParamアノテーションを宣言する

CommonsMultipartResolverのDI定義を追加する

MVC系View定義がされているところあたりのDIに以下のBean定義を追加する。

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000"/>
</bean>

id属性のmultipartResolverはSpringさんが認識するための決まりごとなので、
誤って違う名前で宣言しないように注意すること!

また、CommonsMultipartResolverは内部でapacheのcommons-fileupload.jarを使用しているので、pomの依存ライブラリとして以下の宣言が含まれている確認しておくこと。

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.2.2</version>
</dependency>

formタグにenctype属性を追加する

multipartデータであることを伝えるためにはenctype="multipart/form-data"という属性をformタグに宣言する。

<form method="post" action="/fileupload" enctype="multipart/form-data">
	<input type="file" name="fileupload">
</form>

Controllerのメソッド引数にRequestParamアノテーションを宣言する

ファイルアップロードを受け取るメソッドに対して、MultipartFile型の引数を加えて@RequestParamアノテーションでformタグに定義したnameを指定すればおk。

@Controller
public class FileuploadController {
	@RequestMapping(value="/fileupload", method=RequestMethod.POST)
	public void fileupload(@RequestParam("fileupload") MultipartFile file) {
		//file未選択時もnull値ではないため、サイズ0比較で検証するのがよさげ
		if (file.getSize() > 0) {
			System.out.println(file.getOriginalFilename());
		}
	}
}
Back to Top