カテゴリ: 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でのファイルアップロードの基本
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の場合)
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. アップロード可能な拡張子を制限したい場合
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との連携も大事なんですね。 ただアップできればいい、というわけではないと分かりました。」

先生

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

カテゴリの一覧へ
新着記事
New1
Spring
Spring Securityの新標準!SecurityFilterChainとHttpSecurity DSLの書き方を初心者向けに解説
更新記事
New2
Java
Javaの抽象クラス(abstract)を完全ガイド!継承と設計のルールを学ぶ
更新記事
New3
Servlet
JavaのGenericServletクラスのgetInitParameterNamesメソッドを徹底解説!初心者でもわかる初期化パラメータの取得方法
更新記事
New4
JSP
JSPとは何か?初心者向けにできること・仕組み・特徴をやさしく解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.3
Java&Spring記事人気No3
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.4
Java&Spring記事人気No4
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.5
Java&Spring記事人気No5
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.6
Java&Spring記事人気No6
Java
Java開発環境「Eclipse(Pleiades)」のインストール方法とメリットを初心者向けに解説
No.7
Java&Spring記事人気No7
Spring
Spring BootとVS Codeで開発を始めよう!拡張機能・launch.json・ホットリロードを丁寧に解説
No.8
Java&Spring記事人気No8
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門