낭만 프로그래머

Ajax 와 Servlet 을 이용한 파일 업로드 본문

Java/Common

Ajax 와 Servlet 을 이용한 파일 업로드

조영래 2020. 4. 29. 21:14

자료를 찾아보면 Spring을 이용한 파일 업로드가 대다수 이며 오렐리에서 제공하는 라이브러리가 주를 이룬다.
Spring은 사용하기 싫고 오렐리에서 제공하는 라이브러리는 몇가지 버그가 있는 듯 하다. ㅜㅜ
그래서 찾은 것이 commons-fileupload 라이브러리를 이용하는 것이다.

1. commons-fileupload 와 commons-io 라이브러리를 다운로드
commons-fileupload : http://commons.apache.org/proper/commons-fileupload/
commons-io : http://commons.apache.org/proper/commons-io/

2. Ajax 및 Html 소스

function createNewsAndEvents(e) {
  e.preventDefault();

  var frm = document.getElementById('createNewsAndEventsForm');
  frm.method = 'POST';
  frm.enctype = 'multipart/form-data';
  var fileData = new FormData(frm)

  jQuery.ajax({
    type: "POST",
    enctype: 'multipart/form-data',
    cache: false,
    url: 'restapi/createNewsAndEvents.do',
    data: fileData,
    async: false,
    contentType : false,
    processData : false, 
    dataType: 'json',
    success: function(msg) {
      jQuery('#createNewsAndEventsForm')[0].reset(); //폼내용 삭제
    },
    fail: function() {
    	; 
    }
  });

}
<div id="createWindow">
    <div>
	    <form id="createNewsAndEventsForm" method="post" enctype="multipart/form-data" >
		    <div class="form-group">
			    <label for=enTitle>영문 제목</label>
				<div>
					<input id="enTitle" name="enTitle">
				</div>
			</div>
			<div class="form-group">
				<label for=files>이미지</label>
				<div>
					<input name="files" id="files" type="file" />
				</div>
			</div>
			<div>
				<button onClick="createNewsAndEvents(event)" >생성</button>
			</div>
		</form>
	</div>
</div>

 

3. Servlet 소스

private void createNewsAndEvents(HttpServletRequest req, HttpServletResponse resp) throws Exception {
	req.setCharacterEncoding("UTF-8");
	Map datas = new HashMap();

	// 파일 관련 start	
	String tempStorePath = "c:/temp";
    String storePath = "c:/store";

	try {
		DiskFileItemFactory diskFactory = new DiskFileItemFactory();
		diskFactory.setSizeThreshold(4096); //업로드시 사용할 임시 메모리
		diskFactory.setRepository(new File(tempStorePath)); //임시저장폴더

		ServletFileUpload upload = new ServletFileUpload(diskFactory);
		upload.setSizeMax(100 * 1024 * 1024); //100MB : 전체 최대 업로드 파일 크기
		@SuppressWarnings("unchecked")
		List<FileItem> items = upload.parseRequest(req); 

		Iterator iter = items.iterator();          
		while(iter.hasNext()) {    
			FileItem item = (FileItem) iter.next(); 

			if(item.isFormField()){ //파일이 아닌경우
				String fieldName = item.getFieldName();
				String fieldValue = item.getString("UTF-8");
			}
			else { //파일인 경우
				if (item.getSize() > 0) { 
					String newFileName = UUID.randomUUID().toString();
					String name = item.getFieldName(); 
					String fileName = item.getName(); 
					String contentType = item.getContentType();
					long fileSize = item.getSize(); 

					Path newFilePath = Paths.get(storePath+"/"+newFileName);
					File uploadedFile = newFilePath.toFile();
					item.write(uploadedFile); //파일 저장
				}
			}
		}
	}
	catch(Exception e) {
		;
	}
}