[Spring] 파일 업로드
HTML 폼 전송 방식에는 application/x-www-form-urlencoded
와 multipart/form-data
가 있다. 파일 업로드 기능
을 지원하려면 후자를 택해야 한다. 그러면 스프링에서는 이렇게 업로드한 파일을 어떻게 처리할까?
스프링에서 파일 업로드 기능 지원하기
시작하기 앞서 파일 업로드 시 HTTP 요청 메시지를 로그로 확인하고 싶다면 다음 설정을 해주도록 하자.
아마 파일 정보가 바이너리로 넘어가서 깨지는 내용이 있을텐데 그 부분만 제외하고 보면 이해할 수 있을 것이다.
// application.properties
logging.level.org.apache.coyote.http11=debug
업로드할 파일이 저장될 경로 또한 지정해줘야 한다.
file.dir
이라는 변수를 사용하도록 하자.
// application.properties
file.dir=C:/Users/project/upload/
스프링에서는 MultipartFile
인터페이스로 업로드할 파일을 편리하게 처리할 수 있도록 지원한다!
controller에서 다음과 같이 설정해주자.
@RestController
@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 {
if(!file.isEmpty()) {
String fullPath = fileDir + file.getOriginalFilename(); //파일이 저장될 경로
file.transferTo(new File(fullPath)); //파일 저장
}
return "upload-form";
}
}
fileDir
:@Value
로 위에서 설정한file.dir
의 값을 가져올 수 있음file.getOriginalFilename()
: 업로드된 파일명 가져오는 메소드file.transferTo()
: 파일 저장 메소드
지금은 저장할 경로(fileDir
)에 업로드한 파일명을 붙여서 전체 경로를 설정해주고 있지만 같은 파일명을 갖는 파일들
이 업로드될 수 있으므로 구분해줄 수 있는 별도의 처리가 필요하다. UUID
를 사용해도 되고, 사용자명, 파일명,
시간을 조합해도 된다. 여러 방법이 있으니 원하는 방식으로 구현하자.
application.properties 추가 설정
spring.servlet.multipart.max-file-size=1MB
: 각 파일 최대 사이즈 설정spring.servlet.multipart.max-request-size=10MB
: 모든 파일의 최대 사이즈 설정spring.servlet.multipart.enabled=true
: multipart 처리 할지 여부 설정 (기본값=true)
댓글남기기