[SpringBoot] API방식, File Upload 하기

반응형

 

 

SpringBoot, API 방식으로 File Upload 하기

 

 

 

 

 

  파일 업로드 설정

#MultiPart
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.location=D:\\const/test

 SpringBoot를 사용한다면 위와 같은 코드를 활용하면 된다.

필요에 따라서 추가해도 되고, 삭제해도 된다.

 

max-file-size : 전송되는 개별 파일 크기 제한

max-request-size : 서버에 전송되는 파일의 크기 제한

location : 저장위치 기본 설정 값 (경로에 폴더가 없을 경우 폴더가 새로 생성된다)

 

 

 

  파일 업로드하기

@PostMapping("/upload")
@ResponseBody
public void FileUpload(MultipartFile uploadfile, Model model) {

    try {

        if(!uploadfile.isEmpty()) {
            log.info("file name : "+uploadfile.getOriginalFilename());
            log.info("file content type : "+uploadfile.getContentType());
            uploadfile.transferTo(new File(uploadfile.getOriginalFilename()));
        }


    }
    catch (Exception e ) {
        e.printStackTrace();
    }
}

POSTMAN을 통해서 파일업로드를 진행했다.

 POSTMAN을 활용하여 FILEUPLOAD를 진행하였다.

이 방법을 사용하기 위해서는 MultiPartFile의 매개변수명과 key값을 일치시키기만 하면 된다.

 

파일 업로드가 정상적으로 되었다.

그냥 POSTMAN에 등록시 정상적으로 FILE이 UPLOAD가 되었다.

 

 

오직 파일만을 가져오기 위한 작업이다.

그 외의 데이터를 가져올 수가 없으므로, 잘 사용하지 않는 방법이다.

 

 

  파일 업로드하기 2

@PostMapping("/upload2")
@ResponseBody
public void FileUpload2(MultipartHttpServletRequest request) {
    try {

        log.info("/upload2");
        //request의 file이름을 가져온다.
        String fileName = "Mollang_"+request.getParameter("file");
        String test = request.getParameter("test");
        log.info(test);

        MultipartFile file = request.getFile("file");

        log.info(file.getOriginalFilename());

        file.transferTo(new File(file.getOriginalFilename()));


    }
    catch (Exception e) {

    }
}

 현재? 주로 사용하는 방법이라고 한다.

일반적인 request가 아닌, MultipartHttpServletRequest를 사용한다.

 

jsp에서 사용하는 request방식으로 등록된 모든 key값을 가져올 수 있다는 장점이 있다.

그러나 request만으로 파일 업로드를 진행할 수 없으므로, Multipartfile을 중간에 삽입하여 fileUpload를 진행했다.

 

 

저장 위치 임의 지정

 

 

 

 

 

 

 

 

SpringBoot의 설정이 아닌, File경로 임의지정

SpringBoot의 기본 설정이 아닌, 사용자마다 파일 저장이 필요할 경우 사용하는 방법이다.

File의 생성자에 2개의 값을 넣을 경우, 첫 번째는 경로명, 두 번째는 저장 대상인 파일을 넣을 수가 있다.

 

 

기존 SpringBoot가 폴더의 존재유무를 파악하여, 해당 경로에 맞는 폴더를 자동으로 생성해줬다면...

이 방식은 사용자가 임의로 변경했기 때문에 해당 경로에 폴더가 없을 경우 파일이 생성되지 않는다.

 

 

해결 방법

@PostMapping("/upload3")
@ResponseBody
public void FileUpload3(MultipartHttpServletRequest request) {
    try {

        log.info("/upload3");
        //request의 file이름을 가져온다.
        String fileName = "Mollang_"+request.getParameter("file");
        String test = request.getParameter("test");
        log.info(test);

        MultipartFile file = request.getFile("file");


        //File 경로 임의 지정
        String uploadPath = "D:\\const/test/abc/";

        File fileUpload = new File(uploadPath,file.getOriginalFilename());

        //생성 될 경로가 없을 경우, 파일을 생성한다.
        if(!fileUpload.exists()) {
            log.info(uploadPath+" : 파일 경로 생성완료");
            fileUpload.mkdirs();
        }
        file.transferTo(fileUpload);


    }
    catch (Exception e) {

    }
}

String uploadPath를 통해서 file의 경로를 임의 설정을 하였다.

 

위의 단점은 file의 생성과 생성자 생성을 한 번에 처리한다면

이번 코드는 모두 분할하여 파일의 경로 설정 =>  폴더 경로 유무 파악 => 파일 등록 진행으로 나뉜다는 점이다.

 

등록된 결과는 해당 경로에서 폴더를 열었을 때, 파일의 존재 유무로 성공 여부를 확인할 수가 있다.

이 방식은 SpringBoot 기본 설정하고 연관이 없으므로 properties 설정 중 File 경로를 주석 처리해도 동작이 된다.

 

 

반응형

'Web > SpringBoot' 카테고리의 다른 글

[SpringBoot] JPA 연동하기  (0) 2022.06.16
[SpringBoot] Interceptor 사용하는 방법  (0) 2022.03.26
[SpringBoot] API 활용하기  (0) 2022.03.11
[SpringBoot] Test, JUnit 생성하기  (0) 2022.03.09
[SpringBoot] MyBatis 연동하기  (0) 2022.03.09

댓글

Designed by JB FACTORY