front end/javascript

FormData를 이용한 javascript file upload

노루아부지 2022. 6. 1. 00:22
반응형

일반적으로 파일 업로드를 사용할 때 다음과 같이 submit 방식을 사용합니다.

<form>
  <input type="file" name="files" />
  <input type="submit" value="submit" />
<form>

 

하지만 이 방법은 form 자체가 submit 되어야 하기 때문에 제약이 많습니다.

이 경우 다음과 같이 FormData를 이용해서 서버로 전송할 수 있습니다.

 

1. 테스트를 위한 서버 코드 작성

서버 코드는 Spring boot로 되어 있습니다.

import java.util.List;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@RestController
public class TestController {
  @CrossOrigin("*")
  @RequestMapping("/test")
  public String home(MultipartHttpServletRequest request) {

    List<MultipartFile> files = request.getFiles("files");

    for (MultipartFile file : files) {
      System.out.println(file.getOriginalFilename() + ":" + file.getSize());
    }

    return "test";
  }
}

 

2. javascript 코드 작성

2.1 jQuery 사용

  • ajax parameter 중에 contentType, processData를 false로 설정해야 합니다.
    • data parameter로 전달된 데이터는 jQuery 내부적으로 query string으로 만드는데, 파일 전송에는 이를 피해야 하기 때문에 processData를 false로 설정합니다.
    • contentType은 default 값이 "application/x-www-form=urlencoded; charset=UTF-8"인데, 파일을 전송할 때는 "multipart/form-data"로 전송해야 하기 때문에 contentType을 false로 설정합니다.
<html>
<head>
  <script src="./jquery-3.6.0.min.js"></script>
  <script>
    function submitFiles() {
    let formData = new FormData();
    let files = $("input[name=files]")[0].files;
    let i=0;

    for(i=0; i<files.length; i++) {
      formData.append("files", files[i]);
    }

    $.ajax({
      url: 'http://localhost:8080/test',
      data: formData,
      cache: false,
      contentType: false,
      processData: false,
      type: 'POST',
      success: function(data) {
        console.log(data);
      },
      error: function(e) {
        console.log(e);
      }
    });
  }
  </script>
</head>
<body>
<form>
  <input type="file" name="files" multiple/>
  <button type="button" onclick="submitFiles()">submit</button>
</form>
</body>
</html>

 

 

2.2 javascript 사용

jQuery를 사용하지 않고 다음과 같이 작성 가능합니다.

<html>
<head>
  <script>
    function submitFiles() {
      let formData = new FormData();
      let files = document.querySelector("#files").files;
      let i=0;

      for(i=0; i<files.length; i++) {
        formData.append("files", files[i]);
      }

      var request = new XMLHttpRequest();
      request.open("POST", "http://localhost:8080/test");
      request.send(formData);
    }
  </script>
</head>
<body>
<form>
  <input type="file" name="files" id="files" multiple/>
  <button type="button" onclick="submitFiles()">submit</button>
</form>
</body>
</html>

 

 

 

[참고 사이트]

https://donggu1105.tistory.com/23

 

[Java] Ajax & FormData로 서버에 파일 업로드하기①

안녕하세요, 기록하는 동구 입니다. 이번 포스팅에서는 Ajax와 formData를이용해서 파일을 업로드해보겠습니다. 파일업로드 Ajax 방식의 핵심은 FormData라는 브라우저에서 지원하는 클래스입니다. For

donggu1105.tistory.com

https://developer.mozilla.org/ko/docs/Web/API/Document/querySelector

 

Document.querySelector() - Web API | MDN

Document.querySelector()는 제공한 선택자 또는 선택자 뭉치와 일치하는 문서 내 첫 번째 Element를 반환합니다. 일치하는 요소가 없으면 null을 반환합니다.

developer.mozilla.org

https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects

 

Using FormData Objects - Web APIs | MDN

The FormData object lets you compile a set of key/value pairs to send using XMLHttpRequest. It is primarily intended for use in sending form data, but can be used independently from forms in order to transmit keyed data. The transmitted data is in the same

developer.mozilla.org

 

728x90
반응형
loading