1. 程式人生 > >Java Servlet3.0使用getPart/getParts實現單檔案和多檔案上傳

Java Servlet3.0使用getPart/getParts實現單檔案和多檔案上傳

一、使用工具:

(1)Firefox瀏覽器 (2)Eclipse

二、實現單檔案上傳

(1)Servlet 原始碼

package com.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/upload")
@MultipartConfig // 1.設定Servlet可以處理Multipart請求
public class UploadFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 2.獲取檔案儲存的路徑
		String savePath = this.getServletContext().getRealPath("Files");

		// 3.獲取form表單的Multipart請求的檔案的name屬性
		Part part = request.getPart("photo");

		// 4.獲取原檔名
		/*
		 * 經過過request請求資訊的分析, 原檔名在頭資訊的Content-Disposition中 所以獲取Content-Disposition的值如下
		 * form-data; name="photo"; filename="測試檔案.txt"
		 */
		String header = part.getHeader("Content-Disposition");
		int start = header.lastIndexOf("=");
		String fileName = header.substring(start + 1)
				.replace("\"", "");

		// 5.儲存到第二步獲取的檔案儲存路徑下
		if (fileName != null && !"".equals(fileName)) {
			part.write(savePath + "/" + fileName);
		}

	}

}

這裡需要注意的有三點:   一是 @MultipartConfig 這個註解必須加上,不加不行;   二是通過 getPart(Stirng name) 方法獲取檔案,其中 name 為jsp頁面中的 input標籤的name屬性;   三是為什麼要這樣獲取檔名,這是因為 Servlet3.0 中的 Part 類沒有獲取上傳檔名的方法,然後通過Firefox分析得出header中的 Content-Disposition 包含有檔名。下圖Content-Disposition中包含有檔名的資訊 (2)JSP程式碼

<form action="${pageContext.request.contextPath }/upload" method="post"
		enctype="multipart/form-data">
		<input type="file" name="photo">
		<input type="submit" value="上傳">
</form>

三、實現多檔案上傳

(1)Servlet 原始碼

package com.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/upload")
@MultipartConfig // 1.設定Servlet可以處理Multipart請求
public class UploadFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 2.獲取檔案儲存的路徑
		String savePath = this.getServletContext().getRealPath("Files");

		// 3.獲取form表單上傳的多個檔案
		List<Part> parts = (List<Part>) request.getParts();
		
		//4.迴圈遍歷多個檔案
		for(Part part : parts) {
			// 5.獲取原檔名
			/*
			 * 經過過request請求資訊的分析, 原檔名在頭資訊的Content-Disposition中 所以獲取Content-Disposition的值如下
			 * form-data; name="photo"; filename="測試檔案.txt"
			 */
			String header = part.getHeader("Content-Disposition");
			int start = header.lastIndexOf("=");
			String fileName = header.substring(start + 1)
					.replace("\"", "");

			// 6.儲存到第二步獲取的檔案儲存路徑下
			if (fileName != null && !"".equals(fileName)) {
				part.write(savePath + "/" + fileName);
			}
		}

	}

}

  要實現多檔案上傳只需要在單檔案上傳的的基礎上改一下方法,通過 getParts() 方法獲取多個檔案,然後依次處理就好。 (2)JSP程式碼

<form action="${pageContext.request.contextPath }/upload" method="post"
		enctype="multipart/form-data">
		<input type="file" name="photo" multiple="multiple">
		<input type="submit" value="上傳">
</form>

  注意:input 標籤多了一個屬性 multiple=“multiple”

四、總結

  要實現單檔案上傳只要使用方法 getPart(Stirng name),實現多檔案上傳需要在增加Jsp頁面 input 標籤的 multiple=“multiple”,將 getPart(Stirng name) 方法改為 getParts() 方法,同時遍歷檔案就可以了。