첨부파일을 업로드 하는 방식은 두개가 있다: 폼 방식의 파일 업로드, Ajax를 이용하는 파일 업로드.
Ajax를 이용하는 첨부파일 처리는 FormData라는 객체를 이용한다.
- ( IE의 경우 10 이후의 버전부터 지원되므로 브라우저에 제약이 있을 수 있음)
UploadController에 GET 방식으로 첨부파일을 업로드 하는 페이지 제작.
파일업로드에서 고려해야 하는 점들
@GetMapping("/uploadAjax")
public void uploadAjax(){}
순수한 JavaScript를 이용해서 처리할 수도 있으나, jQuery를 이용해 처리하는 것이 편리하다.
라이브 경로를 추가하고(jQuery CDN) , 스크립트 처리를 한다.
$("#uploadBtn").on("click", function(e){
var formData = new FormData();
var inputFile = $("input[name='uploadFile']");
var files = inputFile[0].files;
console.log(files);
});
jQuery를 이용하는 경우 파일 업로드는 FormData라는 객체를 이용하게 된다. FormData는 쉽게 말해 가상의 폼 태그인데 Ajax를 이용하는 파일 업로드는 FormData를 이용해서 필요한 파라미터를 담아 전송하는 방식이다.
$("#uploadBtn").on("click", function(e){
var formData = new FormData();
var inputFile = $("input[name='uploadFile']");
var files = inputFile[0].files;
console.log(files);
for(var i =0;i<files.length;i++){
formData.append("uploadFile", files[i]);
}
$.ajax({
//url: '${pageContext.request.contextPath}/uploadAjaxAction',
url: '/uploadAjaxAction',
processData : false,
contentType : false,
data : formData,
type : 'POST',
success : function(result){
alert("Uploaded");
}
}); //$.ajax
});
첨부파일 데이터는 formData에 추가한 후 Ajax를 통해 formData 자체를 전송한다.
이때 processData, contentType은 반드시 'false'로 지정해야 전송된다.
UploadController
@PostMapping("/uploadAjaxAction")
public void uploadAjaxPost(MultipartFile[] uploadFile) {
String uploadFolder = "/Users/***/Desktop/untitledfolder/temp";
for (MultipartFile multipartFile : uploadFile) {
String uploadFileName = multipartFile.getOriginalFilename();
// IE has file Path
uploadFileName = uploadFileName.substring(uploadFileName
.lastIndexOf("\\") + 1);
File saveFile = new File(uploadPath,uploadFileName);
try {
multipartFile.transferTo(saveFile);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}