본문 바로가기

1.프로그래밍/Java

[Spring Boot] MultipartResolver 파일 업로드 - 1(Gradle, Ajax)

728x90
반응형

[Spring boot] MultipartResolver 이미지 파일 업로드

참고 블로그 VamPa

gradle 라이브러리 추가

Apache Commons-Io 와 Apache Commons Fileupload 라이브러리 두개를 추가해 준다.

Apache Commons Fileupload 라이브러리 추가 안했다가 에러나서 혼자 삽질했다...

MultipartResolver Bean Creation Exception 해결

implementation 'commons-io:commons-io:2.11.0'    /* Apache commons-io */
implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4' /* Apache Commons FileUpload */

Configuration 설정 Bean 등록

@Bean
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setDefaultEncoding("UTF-8"); // 파일 인코딩 설정
    multipartResolver.setMaxUploadSizePerFile(5 * 1024 * 1024); // 파일당 업로드 크기 제한 (5MB)
    return multipartResolver;
}

View에서 JavaScript 동작

<div class="form_section">
    <div class="form_section_title">
        <label>상품 이미지</label>
    </div>
    <div class="form_section_content">
        <input type="file" name="uploadFile">
    </div>
</div>  
document.querySelector("input[type=file]").addEventListener("change", function () {
    let fileInput = document.querySelector("input[name=uploadFile]");
    let fileObj = fileInput.files[0];

    let formData = new FormData();

    formData.append("uploadFile", fileObj);

    console.log("fileList: " + fileList);
    console.log("fileList[0].name" + fileList[0].name);
    console.log("fileList[0].size" + fileList[0].size);
    console.log("fileList[0].type" + fileList[0].type);

    $.ajax({
        url: '/uploadTest',
        processData : false,
        contentType : false,
        data : formData,
        type : 'POST',
        dataType : 'json'
    });
});

<input type="file"> 태그는 javascript에서 위와 같이 사용가능 하다.

FormData는 쉽게 말하면 가상의 form태그라고 볼 수있다고 한다.
첨부파일을 서버로 전송하기 위한 객체이다.

위의 ajax 통신에서 processData, contentType은 'false'를 해주어야 서버로 전송된다.

url: 서버로 요청을 보낼 url

processData: 서버로 전송할 데이터를 queryString으로 변환 여부

contentType: 서버로 전송되는 content-type

data: 서버로 전송할 data

type: 서버 요청 타입

dataType: 서버로부터 반환받을 데이터 타입

Controller

@RequestMapping(value = "uploadTest", method = RequestMethod.POST)
public void uploadTestPOST(MultipartFile[] uploadFile) {
        logger.info("uploadTestPOST............");

        // 내가 업로드 파일을 저장할 경로
        String uploadFolder = "C:\\upload";
        for (MultipartFile multipartFile : uploadFile) {
            String uploadFileName = multipartFile.getOriginalFilename();
            // 저장할 파일, 생성자로 경로와 이름을 지정해줌.
            File saveFile = new File(uploadFolder, uploadFileName);

            try {
                // void transferTo(File dest) throws IOException 업로드한 파일 데이터를 지정한 파일에 저장
                multipartFile.transferTo(saveFile);    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

MultipartFile 공식 문서

MultipartFile

  • View에서 전송한 multipart 타입의 파일을 다룰 수 있도록 해주는 인터페이스
  • 파일의 이름 변환, 사이즈 변환, 특정 경로에 저장 등을 수행 가능

이후 실행시키면

image

Success!!

성공적으로 내가 업로드한 파일이 내가 지정한 폴더에 저장된다.

공부 목적으로 최대한 간결하고 자세하게 설명해서 글 작성 함.

또한 나같은 초보자도 쉽게 사용 가능하게 끔

728x90
반응형