Enthusiasm! Enthusiasm!

스프링 파일 업로드 본문

자바 스프링/스프링MVC

스프링 파일 업로드

열동 2023. 3. 16. 11:28

HTML폼의 두가지 전송 방식

일반적으로 파일을 업로드 할 때 HTML폼 전송 방식을 사용한다. 파일 업로드 방법을 이해하기 위해서 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다.

  1. application/x-www-form-urlencoded
  2. multipart/form-data

application/x-www-form-urlencoded 방식은 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다. 데이터로는 보통 문자가 사용되며 HTTP Body에 &로 데이터를 구분하여 전송한다. 하지만 파일을 업로드 하려면 바이너리 데이터를 전송해야한다. 또한 파일만 업로드 하는게 아닌 문자와 함께 전송해야하는 상황이 대부분이다. 이 상황을 해결하기 위해 HTTP 에서는 multipart/form-data 전송방식을 제공한다.

multipart 전송방식

위 그림과 같이 multipart/form-data 는 각각의 항목을 구분해서, 한번에 전송하는 것이다. 이 각각의 부분을 part라 한다.


스프링과 파일 업로드

파일경로 저장

먼저 파일을 업로드 하려면 실제 파일이 저장되는 경로가 필요하다. application.properties에 다음과 같이 경로를 저장해두면 된다.

file.dir= /Users/dongyullee/study/file/        ->경로 끝에 /를 반드시 붙여주어야 한다!!

다음과 같이 @value 애노테이션을 사용하여 등록한 파일 경로를 가져올 수 있다.

@Value("${file.dir}")
    private String fileDir;

SpringUploadController

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";
    }
}

스프링에서 제공하는 MultipartFile을 통해 쉽게 파일을 업로드 할 수 있다!

 

주의: 고객이 업로드한 파일명으로 서버 내부에 파일을 저장하면 안된다. 서로 다른 고객이 같은 파일이름을 업로드 하는 경우 기존 파일 이름과 충돌이 날 수 있다서버에서는 저장할 파일명이 겹치지 않도록 내부에서 관리하는 별도의 파일명이 필요하다.

private String createStoreFileName(String originalFilename) {
      String ext = extractExt(originalFilename);
      String uuid = UUID.randomUUID().toString();
      return uuid + "." + ext;
}

private String extractExt(String originalFilename) {
  int pos = originalFilename.lastIndexOf(".");
  return originalFilename.substring(pos + 1);
}

위와 같이 UUID를 통해 파일명이 겹치지 않게하고, 파일을 구분하기 위해 확장자만 따로 추출하여 둘을 합친 뒤 저장하는 방식을 사용하여 저장할 수 있다!

 

다중 파일 저장

<li>이미지 파일들<input type="file" multiple="multiple"

Html 태그에서 multiple 옵션을 사용하면 파일을 여러개 업로드 가능하다. 컨트롤러에서는 List<MultipartFile>과 같이 사용하여 다중 파일을 받을 수 있다.


이 포스팅은 Inflearn 김영한님의 스프링 강의 및 강의자료를 참고하여 작성하였습니다.

 

'자바 스프링 > 스프링MVC' 카테고리의 다른 글

서블릿이 제공하는 HTTP 요청과 응답 처리  (0) 2023.04.05
웹 애플리케이션의 이해  (0) 2023.04.02
스프링 타입 컨버터  (0) 2023.03.15
스프링 예외처리  (0) 2023.03.15
스프링 인터셉터  (0) 2023.03.08
Comments