@RequestMapping(value = "/common/multiFileUpload.do", method = RequestMethod.POST)
public void multiFileUpload(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html; charset=UTF-8");
PrintWriter printWriter = response.getWriter();
HashMap<String, Object> resultMap = new HashMap<String, Object>();
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<HashMap<String, Object>> resultFileList = new ArrayList<HashMap<String, Object>>();
try{
// 이 순간 TEMP 경로에 파일이 써진다. DefaultFileRenamePolicy()에 의해 동일파일명이 있으면 1,2,3 처럼 순번이 붙는다.
// CommonUtil.getTempDir() 은 TEMP 경로이며 아무거나 하면 된다.
MultipartRequest multipartRequest = new MultipartRequest(request, CommonUtil.getTempDir(), 1024 * 1024 * 1024, "UTF-8", new DefaultFileRenamePolicy());
Enumeration<String> files = multipartRequest.getFileNames();
while(files.hasMoreElements()){
HashMap<String, Object> resultFileMap = new HashMap<String, Object>();
String filename = (String) files.nextElement();
if("_uploadFile".equals(filename)){
continue;
}
// 확장자 체크(Optional한 부분)
File tempFile = multipartRequest.getFile(filename);
if(!uploadLmttCheck(tempFile)) {
throw new Exception("업로드 할 수 없는 파일입니다.");
}
resultFileMap.put("DSPLY_FILE_NM", multipartRequest.getOriginalFileName(filename));
resultFileMap.put("STRE_FILE_NM", tempFile.getName());
resultFileMap.put("ABSLT_FLPTH", tempFile.getAbsolutePath());
resultFileMap.put("FILE_MG", tempFile.length());
resultFileMap.put("REGIST_DT", dateFormat.format(date));
resultFileMap.put("REGISTER_NM", CommonUtil.getLoginUser().get("USER_NM"));
resultFileMap.put("REGISTER", CommonUtil.getLoginUser().get("USER_ID"));
resultFileList.add(resultFileMap);
}
resultMap.put("resultFiles", resultFileList);
resultMap.put("result", "SUCCESS");
}catch(Exception e){
resultMap.put("result", "FAIL");
resultMap.put("errorMsg", CommonUtil.printStackTrace(e));
}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValueAsString(resultMap);
printWriter.print(objectMapper.writeValueAsString(resultMap));
}
이 메소드가 실행되면
클라이언트에서 파일 첨부 행위가 일어나면 ajax 를 통해 request가 multiFileUpload 메소드로 온다.
이 메소드는 TEMP 경로에다가 파일을 쓰고 response 객체에 관련 정보를 담고 있는 자바객체(여기서는 resultMap 객체)를 json 스트링으로 만들어 리턴한다.
그럼 ajax에서는 success 부분에 관련 코딩을 하면 된다.
나중에 실제 업로드 확인 버튼을 클릭할 때 원래 경로나 DB에 쓰기를 하고 이 TEMP 경로에 있는 파일은 삭제하는게 좋다.
이 메소드에서 쓰인 MultipartRequest 객체는 아래의 API를 사용했다.
com.oreilly.servlet.MultipartRequest.MultipartRequest(HttpServletRequest arg0, String arg1, int arg2, String arg3, FileRenamePolicy arg4) throws IOException