カテゴリ: Spring 更新日: 2025/12/15

Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定

Spring BootのMultipartFile入門:アップロード/ダウンロードの実装と制限
Spring BootのMultipartFile入門:アップロード/ダウンロードの実装と制限

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

生徒

「Spring Bootでファイルアップロードってどうやるんですか?画像とかExcelとか送れるようにしたいんです」

先生

「Spring BootではMultipartFileを使うことで、簡単にファイルアップロードやダウンロードができます。設定もカスタマイズしやすいんですよ」

生徒

「アップロードのサイズ制限とか、保存先の設定もできるんですか?」

先生

「もちろん可能です!それじゃあ、Spring BootのMultipartFileの基本から実装方法、制限設定まで丁寧に解説していきましょう」

1. MultipartFileとは?Spring Bootで使えるファイルアップロードの仕組み

1. MultipartFileとは?Spring Bootで使えるファイルアップロードの仕組み
1. MultipartFileとは?Spring Bootで使えるファイルアップロードの仕組み

MultipartFileは、ブラウザから送られてきたファイルを Spring Boot アプリ側で受け取るための「ファイルの入れ物」のような役割を持つインターフェースです。画像ファイルやPDF、Excelなど、ユーザーがフォームから選択したファイルを、Javaのオブジェクトとして扱えるようにしてくれます。

具体的には、アップロードされたファイルは一旦メモリ上や一時ファイルとして保持され、コントローラーのメソッド引数に渡されます。開発者はMultipartFileのメソッドを使って、元のファイル名(getOriginalFilename())、サイズ(getSize())、ファイルの種類(getContentType())などの情報を取得したり、ファイルの中身(getBytes())を取り出したりできます。

フォームからファイルを送るときは、通常のフォーム送信とは少しだけ指定が異なります。HTMLの

タグにenctype="multipart/form-data"を必ず付け、メソッドはPOSTを使います。これによって、テキストデータと一緒にバイナリデータ(画像やPDFなど)も分割された状態で安全にサーバーへ送信できるようになります。

イメージしやすいように、最小限のサンプルコードを見てみましょう。


@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    // ここで「file」にアップロードされたファイルが入ってくるイメージ
    // この後、保存したりチェックしたりする処理を追加していきます
    return "uploadSuccess";
}

このように、メソッドの引数にMultipartFileを1つ用意するだけで、フォームから送信されたファイルを受け取る準備ができます。あとはどのように保存するか、どんなルールで扱うかを決めていけば、Spring Bootでファイルアップロード機能を実装できるようになります。

2. HTMLのアップロードフォームを作ってみよう

2. HTMLのアップロードフォームを作ってみよう
2. HTMLのアップロードフォームを作ってみよう

まずは、Spring Bootアプリケーション側にファイルを送信するフォームをHTMLで作成します。


<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">アップロード</button>
</form>

このようなシンプルなフォームでも、MultipartFileを通してファイルを受け取ることができます。

3. Spring Boot側でアップロード処理を実装する

3. Spring Boot側でアップロード処理を実装する
3. Spring Boot側でアップロード処理を実装する

次に、@Controllerクラスでファイルを受け取る処理を実装します。アップロードされたファイルを特定のディレクトリに保存する簡単な例を見てみましょう。


@Controller
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException {
        String uploadDir = "uploads/";
        Path path = Paths.get(uploadDir + file.getOriginalFilename());
        Files.createDirectories(path.getParent());
        Files.write(path, file.getBytes());
        return "uploadSuccess";
    }
}

このコードでは、アップロードされたファイルを指定ディレクトリに保存し、処理が成功すればuploadSuccessというビューを返すようにしています。

4. ダウンロード処理の実装方法

4. ダウンロード処理の実装方法
4. ダウンロード処理の実装方法

アップロードされたファイルをユーザーがダウンロードできるようにするには、Spring MVCのResponseEntityを活用します。


@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) throws IOException {
    Path file = Paths.get("uploads").resolve(filename);
    Resource resource = new UrlResource(file.toUri());

    return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
        .body(resource);
}

このように、ファイル名をパスに含めて取得し、レスポンスに設定することで、任意のファイルをブラウザにダウンロードさせることができます。

5. application.propertiesでアップロードサイズ制限を設定する

5. application.propertiesでアップロードサイズ制限を設定する
5. application.propertiesでアップロードサイズ制限を設定する

Spring Bootでは、application.propertiesに設定を追加することで、アップロード可能な最大サイズを制限できます。


spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

max-file-sizeは1つのファイルサイズ、max-request-sizeは複数ファイルを含むリクエスト全体の制限です。適切なサイズに設定することで、不正な大容量ファイルのアップロードを防げます。

6. 複数ファイルのアップロードに対応するには?

6. 複数ファイルのアップロードに対応するには?
6. 複数ファイルのアップロードに対応するには?

MultipartFile[]を使えば複数ファイルのアップロードにも簡単に対応できます。HTML側のinputタグにmultiple属性をつけることを忘れないようにしましょう。


<form method="post" action="/multi-upload" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">複数ファイルアップロード</button>
</form>

@PostMapping("/multi-upload")
public String uploadMultipleFiles(@RequestParam("files") MultipartFile[] files) throws IOException {
    for (MultipartFile file : files) {
        Path path = Paths.get("uploads", file.getOriginalFilename());
        Files.createDirectories(path.getParent());
        Files.write(path, file.getBytes());
    }
    return "uploadSuccess";
}

このようにMultipartFile[]で複数のファイルを一括処理することで、ユーザーの利便性が大きく向上します。

7. セキュリティ対策:ファイル拡張子・サイズ・保存先のチェック

7. セキュリティ対策:ファイル拡張子・サイズ・保存先のチェック
7. セキュリティ対策:ファイル拡張子・サイズ・保存先のチェック

ファイルアップロードにはセキュリティリスクも伴います。不正な拡張子や想定外の容量、危険なファイルのアップロードを避けるために、以下のような対策を入れることが重要です。

  • 受け入れる拡張子を限定する(例:.jpg, .png, .pdf
  • 保存先のディレクトリにwebアクセス不可の設定を行う
  • ファイルサイズの上限をapplication.propertiesで制御する
  • ファイル名のサニタイズ(特殊文字の除去)

セキュリティを確保しつつ利便性を保つためには、これらの対策を総合的に取り入れることが求められます。

8. Spring Bootでファイルアップロード機能を作る流れ

8. Spring Bootでファイルアップロード機能を作る流れ
8. Spring Bootでファイルアップロード機能を作る流れ

ここまで、Spring BootでMultipartFileを使ったファイルアップロードとダウンロードの基本、HTMLフォームの作成、Javaコードの実装例、ファイル制限の設定、複数ファイル対応、セキュリティ対策まで幅広く解説しました。

これらを順に理解して実装していくことで、堅牢で安全なファイルアップロード機能を構築できます。

まとめ

まとめ
まとめ

ここまでの内容をふりかえりながら、SpringBootで実現できるファイルアップロードとダウンロードの流れをあらためて整理していきます。はじめにMultipartFileという仕組みを通じて送信されたファイルを受け取る方法を見てきましたが、これはSpringBootにおけるファイル処理の中心になるしくみであり、画像やPDFや各種ドキュメントなどさまざまな種類のファイルを柔軟に扱うことができるとても便利な存在でした。フォーム側ではmultipartの指定を用いて正しくデータを送信し、サーバー側ではコントローラの引数にMultipartFileを受け取り、取得したファイルの名前や内容を安全な形で保存することが重要であるという点も確認しました。とくにファイル操作という分野は初心者がつまずきやすい部分が多く、保存先ディレクトリの扱いや例外処理、ファイルサイズの制限などを適切に組み合わせて動かすことで、安定したアプリケーションにつながるということをしっかり理解することができました。 さらにアップロードだけでなく、保存したファイルを指定してダウンロードさせる処理もSpringBootではとても簡単に実装できることを学びました。ResponseEntityやResourceの仕組みを活用し、必要なヘッダーを設定することで、ブラウザにファイルをそのまま返す仕組みが自然に作れることは非常に実用的であり、実務でも日常的に利用されるテクニックです。ファイル名をURLから受け取り、対象のファイルを安全に読み込んでレスポンスとして返すようにする実装は、多くのWebアプリケーションで必要とされる基本機能であり、しっかり理解しておくことでさまざまな開発場面に応用できます。 また、アプリケーション全体として安全に動作させるためにはファイルサイズの上限設定が欠かせず、application.propertiesの設定を活用してサイズ上限を設けることで、意図しない巨大ファイルのアップロードを防ぐことができる点も非常に大切でした。サイズ制限を適切に設定すると、サーバーへの負荷が増えたり、ストレージの圧迫が発生したりすることを防げるため、安定した運用につながります。 そして複数ファイルのアップロードに対応する仕組みでは、MultipartFile配列を使って複数のファイルを一括で処理する方法を学びました。ユーザーが複数のファイルをまとめて送れることは利便性の向上に直結し、入力フォームにmultiple属性を適用するだけで実現できるため初心者の方でも比較的簡単に取り組める部分でした。ファイルごとにループ処理を行いながら保存する構成は分かりやすく、拡張しやすい点も魅力です。 さらにセキュリティの観点から、ファイルの拡張子チェックやファイル名のサニタイズ、保存先の制御など、必要な安全対策についても深く理解することができました。とくにファイルアップロード機能は便利な反面、悪意のあるファイルを送り込まれる危険性を含んでいるため、しっかりとした対策を講じることが欠かせません。Webアプリケーション開発では利便性と安全性をバランスよく両立させることが求められるため、今回学んだ対策はとても重要な基礎知識になります。 以上のように、SpringBootを用いたファイルアップロードとダウンロードの実装方法を習得すると、日常的な業務や個人開発で役立つ機能を幅広く作れるようになり、システムの柔軟性や可能性が大きく広がります。これらの知識を正しく組み合わせていくことで、堅牢で使いやすいファイル操作機能を実装できるようになるため、ぜひ引き続きコードを試しながら理解を深めていってください。

サンプルプログラムの再確認


@PostMapping("/secure-upload")
public String secureUpload(@RequestParam("file") MultipartFile file) throws IOException {
    String filename = file.getOriginalFilename();
    if (!filename.matches(".*\\.(png|jpg|pdf)$")) {
        throw new IOException("不正な拡張子です");
    }
    Path path = Paths.get("uploads/secure", filename);
    Files.createDirectories(path.getParent());
    Files.write(path, file.getBytes());
    return "uploadDone";
}
    
先生と生徒の振り返り会話

生徒

「きょう学んだファイルアップロードの仕組みって、実際の業務でもそのまま使えるんですね。複数ファイルやダウンロードの処理も意外と簡単でびっくりしました。」

先生

「そのとおりです。ファイル処理は応用範囲がとても広いので、一度しくみを理解しておくと大きな武器になりますよ。これからは安全対策も意識しながら実装していきましょう。」

生徒

「拡張子のチェックやファイルサイズの制限って、思っていた以上に重要なんですね。ちゃんと設定しておけば安心してアップロード機能を使えそうです。」

先生

「その気づきはとても大切です。安全性を確保しながら利便性を高めることが、よいアプリケーションづくりの基本になります。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

SpringBootでファイルアップロードをするためにMultipartFileを使う理由は何ですか?初心者でも理解できるポイントを知りたいです。

SpringBootが提供するMultipartFileは、画像ファイルやPDFファイルやExcelファイルなどのデータを簡単に受け取り、安全に処理するための仕組みです。HTTPリクエストから送られたファイルを自動的に取得でき、保存やチェックを行いやすいため、初心者がファイルアップロード機能を作るときにとても便利です。
カテゴリの一覧へ
新着記事
JavaのHttpServletResponseWrapperを完全解説!初心者でも理解できるレスポンス処理のしくみ
JavaのScannerクラスの使い方を徹底解説!初心者でも簡単に学べる入力処理
JavaのArrayListクラスとaddメソッドを完全解説!初心者でもわかるリスト操作
Javaの@Idアノテーションを徹底解説!初心者でもわかるデータベースとの連携方法
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Javaのラムダ式で配列を扱う!Arrays.streamの基本と注意点を初心者向けに解説
No.3
Java&Spring記事人気No3
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.4
Java&Spring記事人気No4
JavaのBigDecimalクラスcompareToメソッド完全ガイド!初心者でもわかる大小比較の基本
No.5
Java&Spring記事人気No5
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.6
Java&Spring記事人気No6
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.7
Java&Spring記事人気No7
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
JSPとは何か?初心者向けにできること・仕組み・特徴をやさしく解説