Java Web 學習筆記之一:伺服器獲取表單上傳的檔案
阿新 • • 發佈:2019-01-02
Servlet3.0標準之後,Java Web檔案上傳就不需要通過FileUpload等庫來實現了,通過servlet API即可實現web後臺的檔案上傳支援。
表單提交請求,表單中的檔案可以通過request.getPart()方法獲取。
下面來介紹獲取檔案的具體使用方法:
(1)在servlet類上新增AMultipartConfig註解
(2)通過HttpServletRequest的getPart()方法或getParts()方法獲取Part物件
(3)通過操作Part物件對獲取的檔案進行操作
注意:
新增@MultipartConfig註解之後,entype=”multipart/form-data”的表單型別也可以通過request.getParameter()
放上例程以及註釋:
1.servlet例程,getpart方法在doPost方法中使用
package com.johnson.servlet; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import com.johnson.tools.UploadUtil; /** * created by johnson on 2016/5/11 * @author johnson * @version 1.0 * @description 嘗試檔案上傳功能的servlet,需要通過jsp/html或者移動裝置的表單格式傳送post請求 * @attention 通過getpart獲取檔案的方法需要servlet3.0以上支援 * @attention 新增@MultipartConfig註解之後,multipart/form-data型別的表單也可以通過request的getparameter方法獲取資料 * */ @MultipartConfig public class FileUploadTestServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public String baseFileSavePath = null;//檔案儲存的基礎路徑(自定義) /** * method init * @throws ServletException * */ public void init(ServletConfig config) throws ServletException{ super.init(config); this.baseFileSavePath = this.getServletContext().getInitParameter("BaseFilePath");//從web.xml排位置檔案中獲取基礎路徑 } /* * @method doPost * @description 在doPost方法中使用getPart方法獲取請求上傳的檔案 * */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.getSession(); try{ Part part0 = request.getPart("file0");//獲取名稱為file0的檔案 part0.write(this.baseFileSavePath+UploadUtil.getFileName(part0));//用Part的write方法將檔案寫入磁碟中 }catch(IOException e){ e.printStackTrace(); } try{ Part part1 = request.getPart("file1");//獲取名稱為file1的檔案 part1.write(this.baseFileSavePath+UploadUtil.getFileName(part1));//用Part的write方法將檔案寫入磁碟中 }catch(IOException e){ e.printStackTrace(); } response.getWriter().write("OK!"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doPost(request, response); } }
2.另外一個類用來從獲取的Part物件中獲取相應的檔案屬性等
package com.johnson.tools; /** * 此工具類只適用於Servlet 3.0 */ import javax.servlet.http.*; public class UploadUtil{ //獲取檔案型別返回一個類似於".XXX"的字串 public static String getFileType(Part p){ String name = p.getHeader("content-disposition"); String fileNameTmp = name.substring(name.indexOf("filename=")+10);//擷取字串獲取檔名 String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\""));//擷取檔名獲取檔案字尾名(型別) return type; } //獲取檔名返回一個類似於"XXX.XXX"的完整檔名,包括了字尾 public static String getFileName(Part p){ String name = p.getHeader("content-disposition"); String fileNameTmp = name.substring(name.indexOf("filename=")+10); String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\"")); return fileName; } }