반응형
일반적으로 파일 업로드를 사용할 때 다음과 같이 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
https://developer.mozilla.org/ko/docs/Web/API/Document/querySelector
https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
728x90
반응형
'front end > javascript' 카테고리의 다른 글
javascript에서 브라우저 종류 확인하는 방법 (0) | 2022.09.29 |
---|---|
javascript에서 UUID 생성하는 방법 (3) | 2022.08.04 |
javascript random number generation (1) | 2022.08.01 |
javascript에서 소숫점 반올림하는 방법 (0) | 2022.03.09 |
javascript - How to get value of selected radio button? (0) | 2021.07.25 |