Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
生徒
「Spring Bootでファイルアップロードってどうやるんですか?画像とかExcelとか送れるようにしたいんです」
先生
「Spring BootではMultipartFileを使うことで、簡単にファイルアップロードやダウンロードができます。設定もカスタマイズしやすいんですよ」
生徒
「アップロードのサイズ制限とか、保存先の設定もできるんですか?」
先生
「もちろん可能です!それじゃあ、Spring BootのMultipartFileの基本から実装方法、制限設定まで丁寧に解説していきましょう」
1. MultipartFileとは?Spring Bootで使えるファイルアップロードの仕組み
Spring Bootでファイルをアップロードする際は、コントローラーのメソッド引数にMultipartFileを使います。これはSpring Frameworkが提供しているインターフェースで、アップロードされたファイルをメモリまたは一時ファイルとして扱える便利な仕組みです。
アップロード対象のフォームには、enctype="multipart/form-data"を必ず指定し、POSTで送信する必要があります。
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側でアップロード処理を実装する
次に、@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. ダウンロード処理の実装方法
アップロードされたファイルをユーザーがダウンロードできるようにするには、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でアップロードサイズ制限を設定する
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. 複数ファイルのアップロードに対応するには?
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. セキュリティ対策:ファイル拡張子・サイズ・保存先のチェック
ファイルアップロードにはセキュリティリスクも伴います。不正な拡張子や想定外の容量、危険なファイルのアップロードを避けるために、以下のような対策を入れることが重要です。
- 受け入れる拡張子を限定する(例:
.jpg,.png,.pdf) - 保存先のディレクトリに
webアクセス不可の設定を行う - ファイルサイズの上限を
application.propertiesで制御する - ファイル名のサニタイズ(特殊文字の除去)
セキュリティを確保しつつ利便性を保つためには、これらの対策を総合的に取り入れることが求められます。
8. Spring Bootでファイルアップロード機能を作る流れ
ここまで、Spring BootでMultipartFileを使ったファイルアップロードとダウンロードの基本、HTMLフォームの作成、Javaコードの実装例、ファイル制限の設定、複数ファイル対応、セキュリティ対策まで幅広く解説しました。
これらを順に理解して実装していくことで、堅牢で安全なファイルアップロード機能を構築できます。