Spring MVCでファイルアップロードを実装!MultipartResolverの設定と使い方
生徒
「Spring MVCでファイルアップロードをやりたいんですが、どうやればいいですか?画像とかPDFをアップできるようにしたいんですけど…」
先生
「Spring MVCでは、MultipartResolverという仕組みを使えば簡単にファイルアップロードを実装できますよ。」
生徒
「設定とか必要ですか?ファイルサイズの制限とかもできるんですか?」
先生
「できます。設定方法やコントローラの記述まで順番に説明していきましょう。」
1. Spring MVCでのファイルアップロードの基本
Spring MVCでは、HTMLフォームからファイルをアップロードする機能を簡単に実現できます。仕組みとしては、multipart/form-data形式で送信されたリクエストをMultipartFileとして受け取り、コントローラで処理するという流れです。
ただし、ファイルアップロードを有効にするには、MultipartResolverの設定が必要です。Spring Bootを使っている場合は、自動で有効になりますが、細かく制御したい場合は明示的に設定を追加します。
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. コントローラでの受け取り方
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の場合)
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定義
Spring Bootを使わず、Spring MVCのみを使っている場合は、MultipartResolverを明示的に@Bean定義する必要があります。
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSize(10485760); // 10MB
return resolver;
}
この設定を@Configurationクラスに記述しておけば、アップロード処理が有効になります。
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. アップロード可能な拡張子を制限したい場合
セキュリティ対策として、アップロードできるファイルの種類を限定するのはとても重要です。MultipartFile#getContentType()を使えば、拡張子やMIMEタイプをチェックできます。
String contentType = file.getContentType();
if (!contentType.equals("image/png") && !contentType.equals("image/jpeg")) {
throw new IllegalArgumentException("画像ファイル(png/jpg)以外はアップロードできません");
}
このような制限を設けることで、不要なファイルのアップロードや、セキュリティリスクを減らせます。
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.propertiesやapplication.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との連携も大事なんですね。 ただアップできればいい、というわけではないと分かりました。」
先生
「その気付きはとても大切です。ファイルアップロードは便利な機能だからこそ、 安全性や運用を意識して実装することが重要です。 ぜひ今回学んだ内容を、実際のアプリケーションでも活かしてみてください。」