把前端form表單裡選中的檔案(圖片)上傳到伺服器
阿新 • • 發佈:2021-11-24
要用到的FileUpload元件
Apache FileUpload元件
maven路徑
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
前端jsp頁面
注:form表單的method和enctype的值要注意
- method="post"
- enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>檔案上傳到伺服器</title> </head> <body> <form action="${pageContext.servletContext.contextPath}/fileUpload" method="post" enctype="multipart/form-data"> 賬號:<input type="text" name="userName"/><br> 密碼:<input type="password" name="pwd"/><br> 頭像:<input type="file" name="file"/><span>${errorMsg}</span><br> <input type="submit" value="註冊"> </form> </body> </html>
自己封裝的檔案(圖片)上傳工具類
import com.feng.Exception.UploadException; 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.apache.commons.io.FilenameUtils; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.Arrays; import java.util.List; import java.util.UUID; public class MyFileUtil { // 設定允許接收的檔案的格式 private static final String ALLWED_IMAGE_TYPE = "png,jpg,gif,jpeg"; // 這裡設定為只能是圖片 public static void frontToServerUpload(HttpServletRequest req) { //解析和檢查請求,是否是post方式,預設是二進位制流格式 Boolean isMultipart = ServletFileUpload.isMultipartContent(req); if (!isMultipart) { return; //如果不是就不用上傳了 } try { //建立FileItemFactory物件 FileItemFactory factory = new DiskFileItemFactory(); //設定快取區大小,預設大小是10kb, ((DiskFileItemFactory) factory).setSizeThreshold(20 * 1024);// 單位b //設定臨時目錄,預設是Tomcat下的temp,不建議設定 //((DiskFileItemFactory) factory).setRepository(臨時目錄不建議修改); //建立檔案上傳的處理器 ServletFileUpload upload = new ServletFileUpload(factory); //解析請求 List<FileItem> items = upload.parseRequest(req); //迭代出每一個FileItem for (FileItem item : items) { // 獲取form表單裡控制元件的name值 String fileName = item.getFieldName(); if (item.isFormField()) { //普通的表單控制元件 //獲取表單控制元件的value值 String value = item.getString("utf-8"); } else { //file型別的表單控制元件 //----------------先獲取上傳檔案的拓展名 /* item.getName()獲取檔名 FilenameUtils.getExtension(String filename);獲取檔案字尾 */ String ext = FilenameUtils.getExtension(item.getName()); //把ALLWED_IMAGE_TYPE裡的字串通過","分割成一個字串陣列 String[] allowedImagetype = ALLWED_IMAGE_TYPE.split(","); //-----------------判斷上傳檔案的拓展名在不在設定的範圍之內,不在的話丟擲提醒並且結束方法 if (!Arrays.asList(allowedImagetype).contains(ext)) { throw new UploadException("你上傳的不是圖片,請重新上傳圖片"); } //上傳檔案的控制元件 //用UUID隨機得到一個檔名 String RandomName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(item.getName()); //獲取存放路徑 String path = req.getSession().getServletContext().getRealPath("/upload"); System.out.println(path); //判斷資料夾是否存在,不在則建立 if(!new File(path).exists()){ new File(path).mkdirs(); } item.write(new File(path, RandomName)); //把上傳的檔案儲存到某個檔案中 //System.out.println(item.isInMemory());//判斷檔案資源是否在記憶體中 } } } //Exception會捕捉上方丟擲的UploadException異常提示,便於把異常資訊返回給Servlet catch (UploadException e) { throw e; } catch (Exception e) { e.printStackTrace(); } } }
自編寫的檔案異常類
用於servlet和和檔案工具類的通訊。
public class UploadException extends RuntimeException{
/**
*
* @param message 異常的資訊,可以自定義的
*/
public UploadException(String message) {
super(message);
}
/**
*
* @param message 異常的資訊
* @param cause 異常的根本原因
*/
public UploadException(String message, Throwable cause) {
super(message, cause);
}
}
檔案上傳servlet
import com.feng.Exception.UploadException;
import com.feng.Util.MyFileUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
System.out.println(req.getSession().getServletContext().getRealPath("/asdf"));
System.out.println("============測試0");
MyFileUtil.frontToServerUpload(req);
}catch (UploadException e){
//拿到我們自己編寫的的UploadException異常資訊
String Msg=e.getMessage();
//把異常資訊傳給前端
req.setAttribute("errorMsg",Msg);
//請求轉發到要跳轉的頁面
req.getRequestDispatcher("/jsp/file_to_server.jsp").forward(req,resp);
}
}
}
web.xml檔案設定
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>FileUpload</servlet-name>
<servlet-class>com.feng.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUpload</servlet-name>
<url-pattern>/fileUpload</url-pattern>
</servlet-mapping>
</web-app>