참고 자료: http://www.cnblogs.com/dongying/p/4388464.html
다중 이미지 업로드를 구현하는 Spring MVC 백엔드 코드 예제입니다.
<!-- 1단계: 필요한 JavaScript 라이브러리 로드 (ajaxSubmit은 jquery.form.js 필요) -->
<script type="text/javascript" src="<%=basePath%>/resources/js/jquery.min.js"></script>
<script type="text/javascript" src="<%=basePath%>/resources/js/jquery.validate.min.js"></script>
<script type="text/javascript" src="<%=basePath%>/resources/js/jquery.form.js"></script>
<!-- 2단계: multipart/form-data 인코딩 설정 -->
<form id="createForm" method="post" action="" class="add-new-area" enctype="multipart/form-data">
<ul>
<!-- 3단계: 모든 file input의 name 속성은 "files"로 통일 -->
<li class="piclis"><label></label><input type="file" name="files" class="img-btn"></li>
<li class="piclis"><label></label><input type="file" name="files" class="img-btn"></li>
<li class="piclis"><label></label><input type="file" name="files" class="img-btn"></li>
<!-- 4단계: 제출 버튼 -->
<li><input type="submit" class="btn save-btn" value="저장"></li>
</ul>
</form>
<script>
$("#createForm").validate({
// 폼 검증 로직
submitHandler: function(form) {
submitViaAjax();
}
});
function submitViaAjax() {
$("#createForm").ajaxSubmit({
type: 'post',
url: "weatherForecast/create",
error: function() {
alert("전송 실패");
},
success: function(data) {
alert("전송 성공");
}
});
}
</script>
중요: 모든 <input type="file"> 필드의 name 속성은 반드시 "files"로 설정해야 합니다. 그렇지 않으면 서버에서 모든 업로드 파일을 수집할 수 없습니다.
Spring MVC 컨트롤러 구현
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.bind.annotation.ResponseBody;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.RequestMapping;
@ResponseBody
@RequiresPermissions("weatherForecast:create")
@RequestMapping("/weatherForecast/create")
public AjaxResponseMsg createWeatherForecast(WeatherForecast weatherForecast,
HttpServletRequest request, HttpSession session) throws IOException {
// 1. HttpServletRequest를 사용하여 파라미터 수신
List<MultipartFile> uploadedFiles = null;
// 2. 요청이 멀티파트 업로드 요청인지 확인
if (request instanceof MultipartHttpServletRequest) {
uploadedFiles = ((MultipartHttpServletRequest) request).getFiles("files");
}
String basePath = session.getServletContext().getRealPath("/");
// 3. 파일 목록이 비어있지 않으면 반복 처리
if (uploadedFiles != null) {
for (MultipartFile file : uploadedFiles) {
// 3.1 파일 저장
String fileUrl = FileHandler.saveFile(file, basePath);
// 3.2 추가 비즈니스 로직 처리
}
}
}
참고 사항:
HttpServletRequest를 사용하면 요청이 멀티파트인지 먼저 확인 가능하므로, 파일이 전송되지 않은 경우에도 오류가 발생하지 않습니다.MultipartFile[]배열로 직접 파라미터를 받으면 파일이 없을 때org.springframework.web.multipart.MultipartException: The current request is not a multipart request예외가 발생할 수 있습니다.
파일 저장 메서드 FileHandler.saveFile()에 대한 자세한 내용은 여기를 참조하세요.