Javaweb使用getPart來接收表單文件


使用getPart接收表單文件時,注意Tomcat版本要在8之上。

前台 : form.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/test" method="post" enctype="multipart/form-data">
    請選擇文件:<input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

后台:TestServlet

@WebServlet(name = "TestServlet", urlPatterns = "/test")
@MultipartConfig
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取文件,參數為前台的name
        Part part = request.getPart("photo");
       	//判斷是否選擇了文件
        if (part.getSize() == 0) {
            request.setAttribute("msg", "請選擇用戶頭像");
            request.getRequestDispatcher("/register.jsp").forward(request, response);
            return;	//不再執行后續操作
        }
        //獲取文件名,獲取到文件名的格式如:a.jpg
        String fileName = part.getSubmittedFileName();
        /**
         截取文件名的后綴名:
         photo.lastIndexOf('.')的返回值為"."的位置,加1表示后綴名的起始位置。
         photo.substring(photo.lastIndexOf('.')+1),表示從后綴名的起始位置截取到結束位置。
         * */
        String fileType = fileName.substring(fileName.lastIndexOf('.') + 1);
        //判斷該文件是不是圖片格式
        if (!("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType) || "png".equalsIgnoreCase(fileType))) {
            //不是圖片格式,停止下一步,並將信息反饋給前台頁面
            request.setAttribute("msg","上傳的文件必須為圖片");
            request.getRequestDispatcher("/form.jsp").forward(request, response);
            return;
        }
        //是圖片類型,構建一個上傳圖片的存儲路徑
        String path = "E:\\upload";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();  //創建文件和文件夾
        }
        //將part內容寫到文件夾內,生成一個文件
        part.write(path + "/" + fileName);
    }
}

String path = "E:\\testPic";設置成本地文件夾路徑與Tomcat服務器脫離關聯,可以防止文件丟失。但需要將該文件夾掛載到Tomcat服務器。

掛載方式:

Eclipse:

1、雙擊集成在Eclipse中的tomcat服務器

img

2、點擊添加額外的web資源

img

3、將本地存儲上傳文件的文件夾添加進來即可!

img

一定要ctrl + S

IDEA:

image-20200719121233092

image-20200719121714219

優化:將上傳圖片封裝成工具類

UploadUtils.java

public class UploadUtils {
    public static String upload(Part part, HttpServletRequest request, HttpServletResponse response) {
        //獲取文件的名稱
        String photo = part.getSubmittedFileName();
        //重命名該文件,防止出現重名文件被覆蓋的情況
        photo = UUID.randomUUID() + photo;
        /**
         截取文件名的后綴名:
         photo.lastIndexOf('.')的返回值為"."的位置,加1表示后綴名的起始位置。
         photo.substring(photo.lastIndexOf('.')+1),表示從后綴名的起始位置截取到結束位置。
         * */
        String fileType = photo.substring(photo.lastIndexOf('.') + 1);
        //判斷該文件是不是圖片格式
        if (!("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType) || "png".equalsIgnoreCase(fileType))) {
            //不是圖片格式,返回空字串
            return "";
        }
        //是圖片類型,構建一個上傳圖片的存儲路徑,並返回字符串的名稱,用於存儲到數據庫
        String path = "E:\\upload";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();  //創建文件和文件夾
        }
        //將part內容寫到文件夾內,生成一個文件
        try {
            part.write(path + "/" + photo);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return photo;
    }
}

調用工具類:

@WebServlet(name = "TestServlet", urlPatterns = "/test")
@MultipartConfig
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    //獲取文件
    Part part = request.getPart("photo");
    //判斷用戶是否選擇文件,如果沒有選擇頭像,不進行后續操作
    if (part.getSize() == 0) {
        request.setAttribute("msg", "請選擇用戶頭像");
        request.getRequestDispatcher("/register.jsp").forward(request, response);
        return;
    }
    String photo = UploadUtils.upload(part, request, response);
    //判斷photo是否為空字符串,為空字符串,說明不是圖片類型,也不進行后續操作
    if (photo == "") {
        request.setAttribute("msg", "請選擇圖片類型的文件,如png,jpg,jpeg");
        request.getRequestDispatcher("/register.jsp").forward(request, response);
        return;
    }
    //不是空字符串,執行后續操作,如將路徑存儲到數據庫等
    ............................................
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM