스프링은 파일 업로드를 위한 MultipartFile 인터페이스를 제공하여 멀티파트 파일 처리를 매우 간단하게 구현할 수 있습니다. 서블릿을 직접 사용하는 방식보다 훨씬 편리한 방법을 알아보겠습니다.
@Slf4j
@Controller
@RequestMapping("/spring")
public class SpringUploadController {
@Value("${file.dir}")
private String fileDir;
@GetMapping("/upload")
public String newFile() {
return "upload-form";
}
@PostMapping("/upload")
public String saveFile(
@RequestParam String itemName,
@RequestParam MultipartFile file,
HttpServletRequest request) throws IOException {
log.info("request={}", request);
log.info("itemName={}", itemName);
log.info("multipartFile={}", file);
if (!file.isEmpty()) {
String fullPath = fileDir + file.getOriginalFilename();
log.info("파일 저장 fullPath={}", fullPath);
file.transferTo(new File(fullPath));
}
return "upload-form";
}
}
MultipartFile 인터페이스는 멀티파트 파일을 처리하기 위한 다양한 메서드를 제공합니다.
| 메서드 | 설명 |
|---|---|
getOriginalFilename() | 업로드된 원본 파일명 반환 |
transferTo(File dest) | 파일을 지정된 경로에 저장 |
isEmpty() | 파일이 비어있는지 확인 |
getSize() | 파일 크기 반환 |
getBytes() | 파일 데이터를 바이트 배열로 반환 |
getContentType() | 파일의 컨텐츠 타입 반환 |
@RequestParam MultipartFile file
@RequestParam 적용@ModelAttribute를 사용하는 객체 안에서도 동일하게 사용 가능if (!file.isEmpty()) {
String fullPath = fileDir + file.getOriginalFilename();
file.transferTo(new File(fullPath));
}
isEmpty()로 파일 존재 여부 확인transferTo()를 사용하여 간단하게 파일 저장실행 시 다음과 같은 로그를 확인할 수 있습니다:
request=org.springframework.web.multipart.support.StandardMultipartHttpServletRequest@5c022dc6
itemName=상품A
multipartFile=org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@274ba730
파일 저장 fullPath=/Users/kimyounghan/study/file/스크린샷.png
Collection<Part> parts = request.getParts();
for (Part part : parts) {
// 파일 처리를 위한 여러 단계의 코드 필요
}
@RequestParam MultipartFile file
file.transferTo(new File(fullPath));
스프링의 MultipartFile을 사용하면:
1. 코드가 매우 간단해짐
2. 파일 처리에 필요한 부가 작업들이 자동화됨
3. 직관적인 API 제공
MultipartFile은 파일 업로드를 위한 매우 편리한 인터페이스를 제공합니다.@RequestParam이나 @ModelAttribute를 통해 쉽게 파일을 바인딩할 수 있습니다.transferTo() 메서드로 단 한 줄의 코드로 파일 저장이 가능합니다.스프링의 MultipartFile을 사용하면 복잡한 파일 업로드 처리를 매우 간단하게 구현할 수 있으며, 실무에서도 이 방식을 주로 사용합니다.