1. 程式人生 > >JQuery 實現檔案上傳

JQuery 實現檔案上傳

簡述:

實現前端使用jquery上傳檔案

後臺用servlet處理檔案上傳以及儲存

知識點:

1. 用到ajaxfileupload.js庫

2. 後臺servlet檔案儲存

其中ajaxfileupload的庫下載地址:

Maven中需要新增兩個java的庫,用來上傳以及在伺服器儲存檔案

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>


專案結構(主要是js)


testUpload.html

<!DOCTYPE html>
<head>
<title>MyWebProject</title>
<meta charset="utf-8" />
<link type="text/css" href="./lib/css/jquery-ui-1.8.19.custom.css"
	rel="stylesheet" />
	<link type="text/css" href="./lib/css/ajaxfileupload.css"
	rel="stylesheet" />
<script type="text/javascript" src="./lib/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="./lib/js/ajaxfileupload.js"></script>
<script type="text/javascript">
function ajaxFileUpload() {
	$.ajaxFileUpload({
		url : "./UploadFile",   //submit to UploadFileServlet
		secureuri : false,
		fileElementId : 'fileToUpload',
		dataType : 'text', //or json xml whatever you like~
		success : function(data, status) {
			$("#result").append(data);
		},
		error : function(data, status, e) {
			$("#result").append(data);
		}
	});
	return false;
}
</script>
</head>

<body>
	<!-- upload file -->
	<form name="form" action="./UploadFile" method="POST" enctype="multipart/form-data">
		<table class="tableForm">
			<thead>
				<tr>
					<th>JQuery Ajax File Upload</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td><input id="fileToUpload"  type="file" size="45" 
						name="fileToUpload"  class="input"></td>
				</tr>
			</tbody>
			<tfoot>
				<tr>
					<td><button class="button" id="buttonUpload"
							onclick="return ajaxFileUpload();">Upload</button></td>
				</tr>
			</tfoot>
		</table>
		<div id="result" style="margin-left:200px"></div>
	</form>
</body>
</html>

後臺實現:

UploadFileServlet.java

package mwp.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static Logger logger = LoggerFactory.getLogger(UploadFileServlet.class);

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//判斷提交過來的表單是否為檔案上傳選單
		boolean isMultipart= ServletFileUpload.isMultipartContent(request);
		if(isMultipart){
			//構造一個檔案上傳處理物件
			FileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);

			Iterator items;
			try{
				//解析表單中提交的所有檔案內容
				items = upload.parseRequest(request).iterator();
				while(items.hasNext()){
					FileItem item = (FileItem) items.next();
					if(!item.isFormField()){
						//取出上傳檔案的檔名稱
						String name = item.getName();
						//取得上傳檔案以後的儲存路徑
						String fileName = name.substring(name.lastIndexOf('\\') + 1, name.length());
						//上傳檔案以後的儲存路徑
						String saveDir = this.getServletContext().getRealPath("/upload/");
						if (!(new File(saveDir).isDirectory())){
							new File(saveDir).mkdir();
						}
						String path= saveDir + File.separatorChar + fileName;

						//上傳檔案
						File uploaderFile = new File(path);
						item.write(uploaderFile);
					}
				}
			}catch(Exception e){
				e.printStackTrace();
				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);  
	            return;  
			}
			response.setStatus(HttpServletResponse.SC_OK);
			response.getWriter().append("Success Upload");
		} 
	} 
}

測試介面:

如若資料交換格式是JSON,則如下示例

JS

/**
 * 上傳圖片
 */
function uploadUnitImage()	{
	    showLoading("正在上傳,請等待...");
	    $.ajaxFileUpload
	    (
	        {
	            url:'/my-web/fileUpload?action=uploadImage',//用於檔案上傳的伺服器端請求地址,目前與優惠券上傳圖片請求地址一致
	            secureuri:false,//一般設定為false
	            fileElementId: 'unitImageToUpload', //檔案上傳空間的id屬性
	            dataType: 'json',//返回值型別 一般設定為json
	            success: function (data, status)  //伺服器成功響應處理函式
	            {
	                if(typeof(data.error) != 'undefined')
	                {
	                    if(data.error != '')
	                    {
	                        alert(data.error);
							dismissLoading();
	                    }else
	                    {
						    //若上傳成功則自定義一些事
						    // do something
	                    }
	                }
	            },
	            error: function (data, status, e)//伺服器響應失敗處理函式
	            {
	                alert(e);
					dismissLoading();
	            }
	        }
	    )
}


JAVA

    public void uploadImage(
    		HttpServletRequest request,HttpServletResponse response) throws Exception{
    	logger.debug("上傳圖片");
    	//上傳圖片
    	String fileUrl=uploadFileAndGetFileUrl(request);
    	String responseText = "";
        if(!StringUtils.isEmpty(fileUrl)){
        	logger.debug("圖片下載地址是"+fileUrl);
        	 responseText="{error: '',url: '"+fileUrl+"'}";
        }else{
        	logger.debug("賬戶建立頁面,圖片上傳失敗");
        	responseText="{error: ''}";
        }
        
        responseOutWithText(response, responseText);
    }

由於AjaxFileUpload在解析返回的response若為JSON資料時會出現問題,所以需要轉為text
	/**
	 * 以文字形式下發資料
	 * @param response
	 * @param responseText
	 */
	protected void responseOutWithText(HttpServletResponse response,
			String responseText) {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		PrintWriter out = null;
		try {
			out = response.getWriter();
			out.println(responseText);
			out.close();
			logger.debug("下發的資料是");
			logger.debug(responseText);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (out != null) {
				out.close();
			}
		}
	}