jQuery/AJAX Fileupload

jQuery AJAX File Upload

Soul-Learner 2014. 8. 8. 12:44

jQuery 이 AJAX 기능을 이용하여 파일을 전송하는 예 ( jQuery AJAX File Upload example )



다른 플러그인을 사용하지 않고 jQuery의 ajax 기능만을 이용하여 파일을 업로드하는 예

HTML5에서 지원하는 FormData 객체를 이용한다

uploadForm.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AJAX 파일 업로드 예</title>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script type="text/javascript">
function ajaxUpload(){
	var formData = new FormData(); 
	formData.append("name", $("input[name=name]").val()); 
	formData.append("desc", $("textarea[name=desc]").text()); 
	formData.append("pic", $("input[name=pic]")[0].files[0]); 
	$.ajax({ 
		url: 'apacheUpload.jsp', 
		data: formData, 
		processData: false, 
		contentType: false, 
		method: 'post', 
		success: function(data){ 
			alert("업로드 성공"); 
		},
		error :function(xhr,status,err){
			alert(err);
		}
	}); 
	return false;
};
</script>
</head>
<body>

<form method="post" enctype="multipart/form-data" 
		onsubmit="return ajaxUpload();"> 
<input type="text" name="name" value="ajax업로드 테스트"/><br/> 
<textarea rows="10" cols="10" name="desc">잘 돼야 할텐데...</textarea><br/> 
<input type="file" name="pic" /> <br>
<button type="submit"> 업로드 </button>
</form>

</body>
</html>



서버측에서 아파치 업로드 라이브러리를 이용하여 멀티파트 업로드를 처리하는 예

apacheUpload.jsp

<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" trimDirectiveWhitespaces="true"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.File" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.io.FilenameUtils"%>

<%
 boolean uploaded = true;
 request.setCharacterEncoding("utf-8");
 
 boolean isMultipart = ServletFileUpload.isMultipartContent(request);
 if (!isMultipart) {
 }else {
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List items = null;
    try {
       items = upload.parseRequest(request);
    } catch (FileUploadException e) {
     out.println("에러 1: "+e);
    }
    //Iterator itr = items.iterator(); // items 는 List 이므로 리스트 다루는 방법으로 해도 된다
    for(int i=0;i<items.size();i++) {
        FileItem item = (FileItem) items.get(i);
        if (item.isFormField()) { // 파일이 아닌 폼필드에 입력한 내용을 가져옴.
          if(item!=null && item.getFieldName().equals("name")) {
            String name = item.getString("utf-8");//form field 안에 입력한 데이터를 가져옴
            System.out.println("전송자:"+name+"<br>"); 
          }else if(item!=null && item.getFieldName().equals("desc")) {
            String desc = item.getString("utf-8");
            System.out.println("파일에 대한 설명:"+desc+"<br>");
          }
       } else { // 폼 필드가 아니고 파일인 경우
          try {
            String itemName = item.getName();//로컬 시스템 상의 파일경로 및 파일 이름 포함
            if(itemName==null || itemName.equals("")) continue;
            String fileName = FilenameUtils.getName(itemName);// 경로없이 파일이름만 추출함
            // 전송된 파일을 서버에 저장하기 위한 절차
            //String rootPath = getServletContext().getRealPath("/");
            File savedFile = new File("D:/upload/"+fileName); 
            item.write(savedFile);// 지정 경로에 파일을 저장함
         } catch (Exception e) {
            System.out.println("서버에 파일 저장중 에러: "+e);
            uploaded = false;
         }
      }    //end of else
    }     // end of for
 } 
%>
{"uploaded":<%=uploaded%>}