カテゴリ: Spring 更新日: 2026/01/09

Spring MVCでファイルアップロードを実装!MultipartResolverの設定と使い方

Spring MVCのファイルアップロード:MultipartResolver の設定と実装
Spring MVCのファイルアップロード:MultipartResolver の設定と実装

先生と生徒の会話形式で理解しよう

生徒

「Spring MVCでファイルアップロードをやりたいんですが、どうやればいいですか?画像とかPDFをアップできるようにしたいんですけど…」

先生

「Spring MVCでは、MultipartResolverという仕組みを使えば簡単にファイルアップロードを実装できますよ。」

生徒

「設定とか必要ですか?ファイルサイズの制限とかもできるんですか?」

先生

「できます。設定方法やコントローラの記述まで順番に説明していきましょう。」

1. Spring MVCでのファイルアップロードの基本

1. Spring MVCでのファイルアップロードの基本
1. Spring MVCでのファイルアップロードの基本

Spring MVCでは、HTMLフォームからファイルをアップロードする機能を簡単に実現できます。仕組みとしては、multipart/form-data形式で送信されたリクエストをMultipartFileとして受け取り、コントローラで処理するという流れです。

ただし、ファイルアップロードを有効にするには、MultipartResolverの設定が必要です。Spring Bootを使っている場合は、自動で有効になりますが、細かく制御したい場合は明示的に設定を追加します。

2. HTML側のフォームの書き方

2. HTML側のフォームの書き方
2. HTML側のフォームの書き方

ファイルアップロード用のHTMLフォームは、enctype="multipart/form-data"を指定し、<input type="file">を使います。


<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    <input type="file" name="file" class="form-control mb-2" />
    <button type="submit" class="btn btn-primary">アップロード</button>
</form>

ここでは、Thymeleafを使った例ですが、通常のHTMLフォームでも同じ構成で動作します。

3. コントローラでの受け取り方

3. コントローラでの受け取り方
3. コントローラでの受け取り方

Spring MVCのコントローラでは、MultipartFileを引数にするだけで、アップロードされたファイルを受け取れます。ファイル名やサイズの取得、保存なども簡単です。


@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
        String filename = file.getOriginalFilename();
        Path path = Paths.get("uploads/" + filename);
        Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
    }
    return "upload-result";
}

このように、ファイルの保存処理も数行で書けてしまいます。uploadsフォルダはあらかじめ作成しておきましょう。

4. MultipartResolverの設定(Spring Bootの場合)

4. MultipartResolverの設定(Spring Bootの場合)
4. MultipartResolverの設定(Spring Bootの場合)

Spring Bootでは、spring-boot-starter-webを使っていれば自動的にMultipartResolverが有効になります。ただし、application.propertiesで制限や保存先などを細かく設定できます。


spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB
spring.servlet.multipart.location=uploads/

この設定を行えば、10MB以上のファイルはアップロードできないよう制限できます。セキュリティやサーバ負荷対策としても重要です。

5. Spring MVCでのMultipartResolverの明示的なBean定義

5. Spring MVCでのMultipartResolverの明示的なBean定義
5. Spring MVCでのMultipartResolverの明示的なBean定義

Spring Bootを使わず、Spring MVCのみを使っている場合は、MultipartResolverを明示的に@Bean定義する必要があります。


@Bean
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setMaxUploadSize(10485760); // 10MB
    return resolver;
}

この設定を@Configurationクラスに記述しておけば、アップロード処理が有効になります。

6. アップロード結果の確認と出力例

6. アップロード結果の確認と出力例
6. アップロード結果の確認と出力例

ファイルのアップロードが成功した場合は、結果画面でファイル名などを表示できます。以下はコントローラからModelを使って渡す例です。


@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
    if (!file.isEmpty()) {
        String filename = file.getOriginalFilename();
        Path path = Paths.get("uploads/" + filename);
        Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
        model.addAttribute("filename", filename);
    }
    return "upload-result";
}

<p th:text="'アップロードされたファイル名: ' + ${filename}"></p>

7. アップロード可能な拡張子を制限したい場合

7. アップロード可能な拡張子を制限したい場合
7. アップロード可能な拡張子を制限したい場合

セキュリティ対策として、アップロードできるファイルの種類を限定するのはとても重要です。MultipartFile#getContentType()を使えば、拡張子やMIMEタイプをチェックできます。


String contentType = file.getContentType();
if (!contentType.equals("image/png") && !contentType.equals("image/jpeg")) {
    throw new IllegalArgumentException("画像ファイル(png/jpg)以外はアップロードできません");
}

このような制限を設けることで、不要なファイルのアップロードや、セキュリティリスクを減らせます。

8. Spring Securityとファイルアップロードの連携

8. Spring Securityとファイルアップロードの連携
8. Spring Securityとファイルアップロードの連携

アプリケーションによっては、ログインしていないユーザーにファイルアップロードを許可したくない場合もあります。その場合、Spring Securityの設定でパス制御を加えることができます。


http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/upload").authenticated()
        .anyRequest().permitAll()
    );

この設定により、ファイルアップロードエンドポイントはログインユーザーのみに制限できます。セキュリティ強化に効果的です。

まとめ

まとめ
まとめ

Spring MVCでのファイルアップロード全体の振り返り

この記事では、Spring MVCにおけるファイルアップロードの基本から、MultipartResolverの役割、HTMLフォームの書き方、コントローラでの受け取り方、ファイル保存処理、サイズ制限や拡張子チェック、さらにはSpring Securityと組み合わせた制御方法まで、一連の流れを丁寧に確認してきました。 ファイルアップロードは、画像投稿、PDF送信、申請書アップロードなど、多くのWebアプリケーションで欠かせない機能です。その一方で、実装を誤るとセキュリティリスクやサーバ負荷の原因にもなります。

Spring MVCでは、multipart/form-data形式のリクエストをMultipartFileとして自然に扱えるため、初心者でも比較的スムーズに実装できます。 特にSpring Bootを利用している場合は、MultipartResolverが自動設定される点が大きな利点です。これにより、設定に悩まずコントローラの実装に集中できます。 一方で、ファイルサイズ制限や保存先の指定、アップロード有効化などは、application.propertiesapplication.ymlで明示的に管理することが重要です。

MultipartResolverとMultipartFileの理解が重要

ファイルアップロード処理の中核となるのがMultipartResolverです。この仕組みがあることで、HTTPリクエスト内のファイルデータを分解し、Spring MVCが扱いやすい形に変換してくれます。 その結果、コントローラ側ではMultipartFileを受け取るだけで、ファイル名、サイズ、Content-Type、InputStreamなどを簡単に取得できます。 実務では、アップロード直後に保存するだけでなく、ウイルスチェックや画像リサイズ、データベース登録などの処理と組み合わせることも多いため、この基本構造を理解しておくことがとても大切です。

また、Spring Bootを使わないSpring MVC構成では、CommonsMultipartResolverなどを@Bean定義する必要がある点も押さえておくべきポイントです。 プロジェクト構成や使用フレームワークによって設定方法が変わるため、自分の環境に合った実装を選択できるようにしておくと安心です。

安全なファイルアップロードのための基本対策

ファイルアップロード機能では、セキュリティ対策が非常に重要になります。 記事内で紹介したように、ファイルサイズ制限を設けること、拡張子やMIMEタイプをチェックすること、保存先ディレクトリを固定することは基本中の基本です。 これらを怠ると、不正ファイルのアップロードやディスク枯渇、想定外の動作につながる可能性があります。

さらに、Spring Securityと連携することで、ログインユーザーのみにアップロードを許可したり、管理者専用のアップロード画面を用意したりすることも可能です。 ファイルアップロードは便利な反面、攻撃対象になりやすい機能でもあるため、認証・認可とセットで設計する意識が重要になります。

基本構成のサンプルおさらい

ここで、Spring MVCでファイルアップロードを行う際の最小構成を改めて整理しておきましょう。 HTMLフォーム、コントローラ、設定が正しくそろっていれば、安定したアップロード処理が実現できます。


@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
        Path path = Paths.get("uploads/" + file.getOriginalFilename());
        Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
    }
    return "result";
}

このようなシンプルな実装から始め、必要に応じてバリデーションやセキュリティ対策を追加していくのが、無理のない進め方です。 基本をしっかり理解しておくことで、機能追加や仕様変更にも柔軟に対応できるようになります。

先生と生徒の振り返り会話

生徒

「Spring MVCのファイルアップロードって、思っていたより仕組みが分かりやすいですね。 MultipartFileを受け取るだけで、いろいろな情報が扱えるのが便利だと感じました。」

先生

「そうですね。最初は難しく見えますが、流れを理解すれば怖くありません。 特にMultipartResolverの役割を知っておくと、全体像がつかみやすくなります。」

生徒

「サイズ制限や拡張子チェック、Spring Securityとの連携も大事なんですね。 ただアップできればいい、というわけではないと分かりました。」

先生

「その気付きはとても大切です。ファイルアップロードは便利な機能だからこそ、 安全性や運用を意識して実装することが重要です。 ぜひ今回学んだ内容を、実際のアプリケーションでも活かしてみてください。」

Springの学習を効率化したい方へ

この記事の内容をもっと深く知るには、以下の入門書が最適です。

Spring Framework超入門をAmazonで見る
カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「StartingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.4
Java&Spring記事人気No4
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.5
Java&Spring記事人気No5
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.6
Java&Spring記事人気No6
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説