Spring

[Spring] ajax를 이용한 파일 업로드

jane.dev 2021. 10. 12. 22:55
반응형

Ajax를 이용해 파일 데이터만을 전송하는 방법

 

2021.10.11 - [Spring] - [Spring] form 태그를 이용한 파일 업로드

 

[Spring] form 태그를 이용한 파일 업로드

form 태그로 파일을 업로드하는 방식은 페이지 이동과 동시에 이루어짐 Get 방식으로 폼에서 업로드할 파일을 받아, Post 방식으로 처리 첨부 파일 처리에 대한 설정은 web.xml에서 함(업로드에 대

wheneveryouwantsz.tistory.com

form태그를 이용한 파일 업로드와 설정 동일

 

Controller 작성

@Controller
@Log4j
public class UploadController

    @GetMapping("/uploadAjax")
    public void uploadAjax(){
        log.info("upload ajax 접속");
    }
    
}

 

/uploadAjax로 접속하면 form에 접근할 수 있도록  view 폴더 아래 uploadAjax.jsp 작성

<div class="uploadDiv">
<!-- form 태그를 통해 파일업로드 하는것과 차이점은 form태그의 유무
     action을 통한 목적지가 없기 때문에 button에 이벤트(버튼을 누르면 파일을 업로드)를 걸 예정 -->
    <input type="file" name="uploadFile" multiple>
</div>

<button id="uploadBtn">Upload</button>

 

Upload 버튼을 클릭하면 해당 파일 업로드를 위한 정보를 저장하고 전송할 수 있도록 작성

$(document).ready(function(){
  $('#uploadBtn').on("click", function(e){
      // 첨부파일을 위한 자료형 FormData
      // FormData 객체를 생성해 제출버튼을 누르면 input태그의 정보가 formData에 저장되도록함
      var formData = new FormData();
      
      // input 태그의 정보를 저장
      var inputFile = $("input[name='uploadFile']");
      
      // input 태그에서 file에 해당하는 정보만을 저장
      var files = inputFile[0].files;

      // 파일이 여러개일 수 있으므로, 반복문을 이용
      for(var i = 0; i < files.length; i++){
          // key와 value로 이루어진 formData에 key와 value값을 추가
          formData.append("uploadFile", files[i]);
      }

      // 비동기 요청으로 파일 데이터 전송
      $.ajax({
          url: '/uploadAjaxAction',
          processData: false,
          contentType: false,
          data: formData,
          type: 'POST',
          success: function(result){
              alert("uploaded!");
          }
      });
  });
});

 

Controller 로 돌아와서 ajax로 전송된 파일 데이터를 받기

@ResponseBody
@PostMapping("/uploadAjaxAction")
public void uploadAjaxPost(MultipartFile[] uploadFile) {
    log.info("ajax post update!");
    
    // web.xml에 작성한 경로와 동일한 경로를 upload될 폴더로 작성
    String uploadFolder = "C:\\upload_data\\test";
    
    for(MultipartFile multipartFile : uploadFile) {
        // getOriginalFilename(): 업로드되는 파일의 이름
        String uploadFileName = multipartFile.getOriginalFilename();
        
        /* substring(): 0부터 파라미터에 들어가는 int 값을 포함한 문자열을 자르고 리턴
         * lastIndexOf(): String의 마지막 문자부터 처음문자로 되돌아오면서 해당 문자열의 index를 찾음
         * uploadFileName의 "\\"가 있는 자리를 찾아 1을 더하고 해당 인덱스 이후부터 자르고 리턴
         */
        uploadFileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\") + 1);
        
        // File 객체를 생성해 저장될 경로와 파일이름을 넣어줌
        File saveFile = new File(uploadFolder, uploadFileName);
        
        try {
            // transferTo(): 파라미터에 File 객체를 넣어 파일 저장하는 메서드
            multipartFile.transferTo(saveFile);
        }catch(Exception e) {
            log.error(e.getMessage());
        }
    }
}

해당 폴더에 파일이 저장된 것을 알 수 있음