티스토리 뷰

반응형

웹에서 멀티(다중)파일을 업로드할 때 아래와 같이 form tag 안에 input tag를 작성해 준다.

이 때 form에 enctype="multipart/form-data" 처리를 꼭 해주어야 함

<form id="fileForm" method="post" enctype="multipart/form-data">
    <input type="file" name="file" multiple="true">
</form>

 

그리고, jquery ajax post 방식으로 java spring controller에 전달해 주는데

  enctype: 'multipart/form-data'

  processData: false

  contentType: false

  data: formData

위 코드들은 필수로 적어 주셔야만 합니다.

var formData = new FormData($('#fileForm')[0]);

$.ajax({
	type: "POST",
	enctype: 'multipart/form-data',	// 필수
	url: '/multipartUpload.do',
	data: formData,		// 필수
	processData: false,	// 필수
	contentType: false,	// 필수
	cache: false,
	success: function (result) {
	},
	error: function (e) {
	}
});

 

아래는 controller에서 MultipartHttpSeervletRequest를 전달받아 List<MultipartFile>로 담아서 아래와 같이 처리 합니다.

@RequestMapping(value = "/multipartUpload.do", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> multipartUpload(MultipartHttpServletRequest request) throws Exception {
    
    List<MultipartFile> fileList = request.getFiles("file");
    
    String path = application.getRealPath("[경로]");
    
    File fileDir = new File(path);
    
    if (!fileDir.exists()) {
    	fileDir.mkdirs();
    }
    
    long time = System.currentTimeMillis();
    
    for (MultipartFile mf : fileList) {
    
    	String originFileName = mf.getOriginalFilename(); // 원본 파일 명
        String saveFileName = String.format("%d_%s", time, originFileName);
        
        try {
        	// 파일생성
            mf.transferTo(new File(path, saveFileName));    		
        } catch (Exception e) {
            e.printStackTrace();
        }
   }
}

 

 

아래 코드 중

if(request.getFiles("file").get(0).getSize() != 0){
     fileList = request.getFiles("file");
}

 

이 부분은 웹에서 첨부파일을 하지 않고 넘겼을 경우, fileList가 위와 같이

List<MultipartFile> fileList = request.getFiles("file"); 일 때에는 .size()가 무조건 1이라

아래 for 문에서 무조건 하나가 처리되어 파일명이 null로 저장되는 경우

아래와 같이 추가 하면 됩니다.

@RequestMapping(value = "/multipartUpload.do", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> multipartUpload(MultipartHttpServletRequest request) throws Exception {
    
    List<MultipartFile> fileList = new ArrayList<MultipartFile>();
    
    // input file 에 아무것도 없을 경우 (파일을 업로드 하지 않았을 때 처리)
    if(request.getFiles("file").get(0).getSize() != 0){
    	fileList = request.getFiles("file");
    }
        
    String path = application.getRealPath("[경로]");
    
    File fileDir = new File(path);
    
    if (!fileDir.exists()) {
    	fileDir.mkdirs();
	}
    
    long time = System.currentTimeMillis();
    
    for (MultipartFile mf : fileList) {
    
    	String originFileName = mf.getOriginalFilename(); // 원본 파일 명
        String saveFileName = String.format("%d_%s", time, originFileName);
        
        try {
        	// 파일생성
            mf.transferTo(new File(path, saveFileName));    		
        } catch (Exception e) {
        	e.printStackTrace();
        }
     }
}

 

반응형
댓글