9.1. ファイルアップロード標準
9.1.1. ファイルサイズ制限
application.yml にファイルアップロードのサイズ制限を設定します。
yaml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 50MB| 設定 | デフォルト値 | 説明 |
|---|---|---|
max-file-size | 10MB | 単一ファイルの最大サイズ |
max-request-size | 50MB | リクエスト全体の最大サイズ(複数ファイルを含む) |
9.1.2. 許可拡張子 / MIMEタイプ検証
ファイルの拡張子とMIMEタイプの両方を検証しなければなりません。拡張子のみの検証では偽装が可能です。
java
@ConfigurationProperties(prefix = "app.storage")
public record StorageProperties(
String uploadPath,
long maxFileSize,
List<String> allowedExtensions,
List<String> allowedMimeTypes
) {}yaml
app:
storage:
upload-path: /data/uploads
max-file-size: 10485760
allowed-extensions:
- pdf
- png
- jpg
- jpeg
- gif
- xlsx
- docx
allowed-mime-types:
- application/pdf
- image/png
- image/jpeg
- image/gif
- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- application/vnd.openxmlformats-officedocument.wordprocessingml.document9.1.3. ファイル名処理
アップロードされたファイルは UUIDベースの保存名 で保存し、元のファイル名 はメタデータとして保持します。
java
public class FileNameGenerator {
public static String generate(String originalFilename) {
String extension = extractExtension(originalFilename);
return UUID.randomUUID() + "." + extension;
}
private static String extractExtension(String filename) {
int lastDot = filename.lastIndexOf('.');
if (lastDot == -1) {
throw new InvalidFileException("拡張子のないファイルはアップロードできません。");
}
return filename.substring(lastDot + 1).toLowerCase();
}
}| 項目 | ルール |
|---|---|
| 保存ファイル名 | UUID + 拡張子 (550e8400-e29b-41d4-a716-446655440000.pdf) |
| 元のファイル名 | DBに別途保存 |
| 拡張子 | 小文字に統一 |