File Upload
📤 File Upload란?
정의
File Upload는 사용자가 선택한 파일을 서버로 전송하고, 서버가 이를 저장하거나 처리하는 기능이다. 일반적으로
multipart/form-data형식으로 전송한다.
🧩 업로드 처리 시 고려할 점
- 파일 크기 제한을 설정해야 한다.
- 허용 확장자를 검증해야 한다.
- 파일명 충돌을 방지해야 한다.
- 외부에서 업로드된 파일은 신뢰하지 말고 검증해야 한다.
- 업로드 경로와 접근 경로를 분리하는 것이 좋다.
⚙️ Spring Boot 설정
application.yml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
포인트
max-file-size는 개별 파일 크기 제한이고,max-request-size는 전체 요청 크기 제한이다.
🛠️ Spring Boot 업로드 예시
HTML 폼
<form method="post" enctype="multipart/form-data" action="/files/upload">
<input type="file" name="file">
<button type="submit">업로드</button>
</form>
Controller
@Controller
@RequestMapping("/files")
public class FileUploadController {
private final Path uploadDir = Paths.get("uploads");
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
if (file.isEmpty()) {
return "파일이 비어 있습니다.";
}
Files.createDirectories(uploadDir);
String originalFilename = StringUtils.cleanPath(Objects.requireNonNull(file.getOriginalFilename()));
String savedFilename = UUID.randomUUID() + "_" + originalFilename;
Path targetPath = uploadDir.resolve(savedFilename);
Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
return "업로드 완료: " + savedFilename;
}
}
업로드 파일 정보 확인
@GetMapping("/info")
@ResponseBody
public String fileInfo(@RequestParam("file") MultipartFile file) {
return "파일명: " + file.getOriginalFilename() + ", 크기: " + file.getSize();
}
🔒 검증 예시
if (!Objects.requireNonNull(file.getOriginalFilename()).endsWith(".png")) {
throw new IllegalArgumentException("png 파일만 업로드할 수 있습니다.");
}
[!important] 주의 파일 확장자만으로 안전성을 판단하면 안 된다. 필요하면 MIME 타입, 내용 검사, 저장 경로 분리까지 함께 고려해야 한다.
📦 저장 방식
- 로컬 디스크 저장
- S3 같은 외부 스토리지 저장
- DB에는 파일 자체보다 메타데이터만 저장
🧠 함께 보면 좋은 개념
- Multipart
- HTTP Request
- WebServer
댓글남기기