實現文件上傳:
1.jar包
需要用到兩個jar包: commons-io.jar commons-fileupload.jar 下載地址:https://mvnrepository.com/
2.from表單:
2.1.多部分(enctype="multipart/form-data")表單
2.2.請求必須是post請求, 因為get請求文件只支持2k-4k左右
3.servlet:
實現文件上傳需要用到一個核心類:ServletFileUpload
實現代碼: (代碼已注釋)
package cn.happy.Servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //實現文件上傳需要用到一個核心類:ServletFileUpload //1.判斷是否為多部分表單使用ServletFileUpload的isMultiPartContent()方法。 boolean isMulti = ServletFileUpload.isMultipartContent(request); //FileItemFactory是一個接口,接口不可以new 接口,只能new他的實現類 // ctrl+鼠標左鍵進入FileItemFactory接口 ctrl+T可以看到他的實現類。他有一個叫DiskFileItemFactory的實現類 // 去new DiskFileItemFactory實現類 FileItemFactory factory=new DiskFileItemFactory(); //2.實例化ServletFileUpload ServletFileUpload servletFileUpload =new ServletFileUpload(factory);//需要傳入一個FileItemFactory try { List<FileItem> fileItems = servletFileUpload.parseRequest(request); String value=null; for (FileItem item:fileItems) { if (item.isFormField()){//表單中的字段為普通字段進入if內 String name = item.getFieldName();//獲取普通表單字段的name if (name.equals("tname")){ value = item.getString(); System.out.println(value); } }else{//文件域表單字段進入else內 //獲取到文件域字段 String childPath = item.getName(); //獲取存放地址的全路徑,這里把upload放在WEB-INF目錄下是因為客戶不可以直接訪問WEB-INF目錄 String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/FileUploads"); System.out.println("path====:"+realPath); //String parent, String child傳入一個父路徑,一個子路徑, File fileDir = new File(realPath); if (!fileDir.exists()) { fileDir.setWritable(true); //mkdir 單層創建 , mkdirs 逐層創建 fileDir.mkdirs(); } File file=new File(realPath,childPath); try { item.write(file); } catch (Exception e) { e.printStackTrace(); } } } request.setAttribute("tvalue",value); request.getRequestDispatcher("/come.jsp").forward(request,response);//頁面跳轉 } catch (FileUploadException e) { e.printStackTrace(); } } }
servlet中:FileItemFactory是一個接口,接口只能new實現類。 對准FileItemFactory Ctrl+T可以看到接口的實現類
在實現文件上傳存放目錄時,File的參數是String parent, String child ,進入File Ctrl+O 查看類中定義了那些方法,文件上傳使用的是File的這個有參構造
紅框的地方:去判斷路徑的文件夾是否存在,如果不存在就創建出文件夾。
這里在WEB-INF目錄下創建文件夾存放文件是因為WEB-INF目錄下的內容,客戶端不可以直接訪問。安全性比較高
4.頁面代碼:
FileUpload.jsp:
<%-- Created by IntelliJ IDEA. User: 秀清風 Date: 2018/12/23 Time: 21:27 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>文件上傳</title> </head> <body> <%--文件上傳 1.多部分(enctype="multipart/form-data")表單 2.請求必須是post請求, 因為get請求文件只支持2k-4k左右 --%> <form action="${pageContext.request.contextPath}/fileUploadServlet" method="post" enctype="multipart/form-data"> 上傳者姓名:<input type="text" name="tname"> 選擇文件:<input type="file" name="upload"><br> <input type="submit" value="點擊上傳"> </form> </body> </html>
come.jsp:
<%-- Created by IntelliJ IDEA. User: 秀清風 Date: 2018/12/24 Time: 14:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h2>嗨!你好${tvalue}</h2> </body> </html>
上傳的文件沒有存放在你項目中的目錄,而是存放在了tomcat中的目錄。
如果要知道上傳的文件在哪里存放,兩種方式
1.后台打印出存放目錄,去磁盤中尋址
2.可以在tomcat服務器中尋址到存放目錄。
展示:
文件存放目錄: