블로그

Interface MultipartFile, Class File (파일 업로드) 본문

개발자 준비과정/Spring, SpringBoot, JSP

Interface MultipartFile, Class File (파일 업로드)

하늘바람a 2024. 5. 28. 17:43

Spring 프레임워크

 

Interface MultipartFile

 

MultipartFile. 파일 업로드 요청을 처리할 때 사용

 

 

보통 리액트에서 스프링으로 데이터를 보낼 때 JSON 형식으로 전송하였다.

하지만 json은 텍스트 기반의 데이터 교환 형식이므로 파일이나 사진 등은 JSON로 보낼 수 없다.

사진, 파일은 바이너리 데이터이다. 그러므로 멀티파트 형식(multipart/form-data)을 이용한다.

 

멀티파트 요청은 HTTP 요청 본문에 파일을 포함시키는 방식이다.

 


리액트에서 스프링으로 파일 데이터가 전송되는 과정
1. 리액트에서 axios를 사용하여 FormData를 요청 본문으로 전송한다.
이 때, 요청의 Content-Type 헤더는 multipart/form-data로 자동 설정된다.
2. 스프링 서버의 MultipartResolver 빈을 사용하여 요청의 Content-Type을 검사하고 ' multipart/form-data' 인 경우 요청 본문에서 파일 데이터를 추출한다.
3. 추출한 파일 데이터를 MultipartFile 인터페이스로 래핑한다.(MultipartFile에 바인딩한다)
4. 스프링 컨트롤러의 @RequestParam 어노테이션으로 MultipartFile 객체를 주입받는다.x

 

이렇게 하면 컨트롤러에서 MultipartFile의 메서드(getBytes(),transferTo() 등)을 사용하여 파일 데이터를 직접 다룰 수 있다.

 

 


 MultipartFile의 메소드 중 일부

getOriginalFilename()

 

transferTo()

 

 

  transferTo() 설명

 

"If the destination file already exists, it will be deleted first."

즉, 대상 파일(dest)이 이미 존재한다면 해당 파일을 먼저 삭제한 후에 업로드된 파일의 내용을 dest 파일로 전송(옮기거나 복사)한다는 뜻이다.
따라서 기존에 같은 이름의 파일이 있었다면 그 파일을 덮어쓰게 되는 것이다.

"call this method just once in order to work with any storage mechanism."

이 메서드는 단 한번만 호출할 수 있다는 점도 주의해야 한다. 한번 transferTo로 파일을 옮기거나 복사하면 더 이상 MultipartFile 객체에 파일 데이터가 남아있지 않기 때문이다.
 
 

 

스프링 코드
    public void add(Board board, MultipartFile[] files, Authentication authentication) {
        board.setMemberId(Integer.valueOf(authentication.getName()));
        mapper.insert(board);

        if (files != null) {
            for (MultipartFile file : files) {
                // db에 해당 게시물의 파일 목록 저장
                mapper.insertFileName(board.getId(), file.getOriginalFilename());
                // 실제 파일 저장
                // 부모 디렉토리 만들기
                String dir = STR."C:/Temp/prj2/\{board.getId()}";
                File dirFile = new File(dir);
                if (!dirFile.exists()) {
                    dirFile.mkdirs();
                }


                // 파일 경로
                String path = STR."C:/Temp/prj2/\{board.getId()}/\{file.getOriginalFilename()}";
                File destination = new File(path);
                file.transferTo(destination);
            }
        }
    }

 

 


 

 

Class File

 

Class File

 

 

File 클래스의 생성자

 

File class의 생성자

 

 

File 클래스의 메서드 중 일부

 

mkdirs()
exists()
delete()