1 분 소요

HTML 폼 전송 방식에는 application/x-www-form-urlencodedmultipart/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)

카테고리:

업데이트:

댓글남기기