Spring MVC(+ Spring Boot) におけるファイルアップロード

必要な設定とMultipartFileの動きのまとめ。

執筆時バージョン
Java

Java SE 8

設定

サーバーの設定

ファイルのアップロードを行う場合、通常JavaEEサーバーの制限が設定されている(Webサーバーも)ので見直しをする。特にバイト数制限の修正が必要。

組み込みサーバーを利用するSpring Bootの場合は、プロパティファイルからその設定を変更できる。

application.ymlの設定(値はデフォルト値)
spring:
  http:
    multipart:
      max-file-size: 1MB
      max-request-size: 10MB
設定項目 内容

max-file-size

1ファイルにおける最大バイト数

max-request-size

(複数アップロード時の)1リクエストにおける最大バイト数

Webのコントローラとフォームの設定

「org.springframework.web.multipart.MultipartFile」というインタフェースでアップロードしたファイルを受け取る。

フォームの例
@Data
public class FileUploadSampleForm implements Serializable {
  private MultipartFile uploadedFile;
}

コントローラはPOSTで受け取る。

コントローラメソッドの例
@PostMapping("/upload") String upload(FileUploadSampleForm fileUploadSampleForm) {
  //…
}

HTMLフォームの設定

「enctype="multipart/form-data"」を忘れないようにする。これを設定しないと(HTML仕様上)ファイルの中身が送信されない。

<form action="#" th:action="@{./upload}" method="post" enctype="multipart/form-data" th:object="${form}">
  <input type="file" th:field="*{uploadedFile}" />
  <button type="submit">送信</button>
</form>

MultipartFileの状態

HTMLフォーム上の操作状況によって、MultipartFileオブジェクトは次のようになる。

状況 MultipartFile
オブジェクト
getSize() getOriginalFilename()

HTML上のアップロードフィールドが
設定されなかった

null

-

-

(アップロードフィールドは準備されたが)
アップロードされなかった

生成

0(バイト)

""(空文字)

0バイトのファイルがアップロードされた

生成

0(バイト)

アップロードファイルのファイル名

通常のファイルがアップロードされた

生成

アップロードファイルのバイト数

アップロードファイルのファイル名

MultipartFile

MultipartFileクラス
Figure 1. MultipartFileクラス

MultipartFileはSpringにおけるファイルアップロードなどの受け取りに利用するインタフェース。

Table 1. メソッド
メソッド 概要

isEmpty()

ファイルが空(0バイト)の場合true。

getSize()

ファイルサイズ(バイト数)。

getName()

フォームにおけるname。

getOriginalFilename()

アップロードファイルのファイル名。

getBytes()

アップロードファイルをbyte配列で取得。

getInputStream()

アップロードファイルのInputStreamを取得。

transferTo(File dest)

アップロードファイルを指定ファイルに転送する。

Appendix B: 改訂履歴

  • v1.0, 2016-08-12: 初稿