Spring MVC에서 멀티파일 업로드 처리 가이드

참고 자료: 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()에 대한 자세한 내용은 여기를 참조하세요.

태그: Spring MVC 파일 업로드 MultipartFile jQuery Form Plugin multipart/form-data

7월 25일 20:27에 게시됨