be_better

[Springboot] MultipartFile 로 이미지 업로드 본문

Springboot/코딩

[Springboot] MultipartFile 로 이미지 업로드

NiceTry 2023. 12. 14. 12:10

목차

    프로젝트 진행 중

     

    유저의 프로필 사진을 받아 AWS s3에 저장하는 기능을 구현하기 전에

    로컬 디렉토리에 이미지가 저장되는지 확인하기 위해 간단하게 테스트를 진행했다.

     

    업로드 테스트

    편의를 위해 Controller 만 구현하였다.

    TestController
    @Slf4j
    @RestController
    @RequestMapping("/test")
    public class TestController {
    
      @GetMapping("")
      public String uploadImgFile(@RequestParam(value = "image") MultipartFile image) {
    
        log.info("[uploadImgFileTest] file name : {}", image.getOriginalFilename());
    
        try {
          image.transferTo(
              new File("/Users/parktj/Documents/IntelliJ/personal/Onbition/doc/img/"
                  + image.getOriginalFilename())
          );
          
        } catch (IOException e) {
          e.printStackTrace();
        }
    
        return image.getOriginalFilename();
      }
      
    }

     

     

    Postman test

    postman test

    Postman 에서 테스트를 하려면 Body에 form-data 에서 Key값을 file 형식으로 지정하고 반드시 key name을 써줘야 한다.

     

    postman 에러

    file working directory 에러가 뜰 경우에는 다음과 같이 해결한다.

    Setting - General - Working directory에서

    파일을 찾을 directory를 선택하고 Read files outside working directory를 체크한다.

     

    정상적으로 동작

    에러 없이 정상적으로 동작했다면 이미지 파일이 해당 디렉토리에 저장된것을 확인할 수 있다.

     

    시행착오

    file pathname

     

    file pathname을 주의하자!!

    file pathname을 작업중인 디렉토리가 아닌 ~(루트) 디렉토리부터 써줘야 한다.

     

    RequestParam vs RequestPart

    @GetMapping("")
    public String uploadImgFile(@RequestPart MultipartFile image) {
    
      log.info("[uploadImgFileTest] file name : {}", image.getOriginalFilename());
    
      try {
        image.transferTo(
            new File("/Users/parktj/Documents/IntelliJ/personal/Onbition/doc/img/"
                + image.getOriginalFilename())
        );
    
      } catch (IOException e) {
        e.printStackTrace();
      }
    
      return image.getOriginalFilename();
    }

     

    RequestParam과 RequestPart는 혼용해서 많이 사용한다는데,,

     

    RequestParam

    RequestParam다른 RequestParam들과 같이 사용할 때 사용하고

    example
    @GetMapping("")
    public String uploadImgFile(
        @RequestParam("image") MultipartFile image,
        @RequestParam("name") String name) {
        
        ... (생략)
        
    }

     

    RequestPart

    RequestPartRequestBody와 같이 JSON 형식으로 값을 받는것과 같이 사용할 때 사용하면 된다고 이해한다.

    example
    @GetMapping("")
    public String uploadImgFile(
        @RequestPart("image") MultipartFile image,
        @RequestPart RequestDto request) {
        
        ... (생략)
    }

    만약 RequestPart에 MultipartFile 데이터가 포함되어있지 않다면 RequestBody와 동일한 동작을 한다!