Java Servlet3.0使用getPart/getParts實現單檔案和多檔案上傳
阿新 • • 發佈:2018-12-11
一、使用工具:
(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 包含有檔名。下圖 (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() 方法,同時遍歷檔案就可以了。