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 {
//獲取文件,參數(shù)為前臺的name
Part part = request.getPart("photo");
//判斷是否選擇了文件
if (part.getSize() == 0) {
request.setAttribute("msg", "請選擇用戶頭像");
request.getRequestDispatcher("/register.jsp").forward(request, response);
return; //不再執(zhí)行后續(xù)操作
}
//獲取文件名,獲取到文件名的格式如:a.jpg
String fileName = part.getSubmittedFileName();
/**
截取文件名的后綴名:
photo.lastIndexOf('.')的返回值為"."的位置,加1表示后綴名的起始位置。
photo.substring(photo.lastIndexOf('.')+1),表示從后綴名的起始位置截取到結(jié)束位置。
* */
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;
}
//是圖片類型,構(gòu)建一個上傳圖片的存儲路徑
String path = "E:\\upload";
File file = new File(path);
if (!file.exists()) {
file.mkdirs(); //創(chuàng)建文件和文件夾
}
//將part內(nèi)容寫到文件夾內(nèi),生成一個文件
part.write(path + "/" + fileName);
}
}
String path = "E:\\testPic";設(shè)置成本地文件夾路徑與Tomcat服務(wù)器脫離關(guān)聯(lián),可以防止文件丟失。但需要將該文件夾掛載到Tomcat服務(wù)器。
掛載方式:Eclipse:
1、雙擊集成在Eclipse中的tomcat服務(wù)器

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

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

一定要ctrl + S
IDEA:


優(yōu)化:將上傳圖片封裝成工具類
UploadUtils.java
public class UploadUtils {
public static String upload(Part part, HttpServletRequest request, HttpServletResponse response) {
//獲取文件的名稱
String photo = part.getSubmittedFileName();
//重命名該文件,防止出現(xiàn)重名文件被覆蓋的情況
photo = UUID.randomUUID() + photo;
/**
截取文件名的后綴名:
photo.lastIndexOf('.')的返回值為"."的位置,加1表示后綴名的起始位置。
photo.substring(photo.lastIndexOf('.')+1),表示從后綴名的起始位置截取到結(jié)束位置。
* */
String fileType = photo.substring(photo.lastIndexOf('.') + 1);
//判斷該文件是不是圖片格式
if (!("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType) || "png".equalsIgnoreCase(fileType))) {
//不是圖片格式,返回空字串
return "";
}
//是圖片類型,構(gòu)建一個上傳圖片的存儲路徑,并返回字符串的名稱,用于存儲到數(shù)據(jù)庫
String path = "E:\\upload";
File file = new File(path);
if (!file.exists()) {
file.mkdirs(); //創(chuàng)建文件和文件夾
}
//將part內(nèi)容寫到文件夾內(nèi),生成一個文件
try {
part.write(path + "/" + photo);
} catch (IOException e) {
e.printStackTrace();
}
return photo;
}
}
調(diào)用工具類:
@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");
//判斷用戶是否選擇文件,如果沒有選擇頭像,不進(jìn)行后續(xù)操作
if (part.getSize() == 0) {
request.setAttribute("msg", "請選擇用戶頭像");
request.getRequestDispatcher("/register.jsp").forward(request, response);
return;
}
String photo = UploadUtils.upload(part, request, response);
//判斷photo是否為空字符串,為空字符串,說明不是圖片類型,也不進(jìn)行后續(xù)操作
if (photo == "") {
request.setAttribute("msg", "請選擇圖片類型的文件,如png,jpg,jpeg");
request.getRequestDispatcher("/register.jsp").forward(request, response);
return;
}
//不是空字符串,執(zhí)行后續(xù)操作,如將路徑存儲到數(shù)據(jù)庫等
............................................
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用TCP協(xié)議發(fā)送和接收數(shù)據(jù)方式
這篇文章詳細(xì)介紹了Java中使用TCP進(jìn)行數(shù)據(jù)傳輸?shù)牟襟E,包括創(chuàng)建Socket對象、獲取輸入輸出流、讀寫數(shù)據(jù)以及釋放資源,通過兩個示例代碼TCPTest01.java和TCPTest02.java,展示了如何在客戶端和服務(wù)器端進(jìn)行數(shù)據(jù)交換2024-12-12
因Spring AOP導(dǎo)致@Autowired依賴注入失敗的解決方法
這篇文章主要給大家介紹了因Spring AOP導(dǎo)致@Autowired依賴注入失敗的解決方法,文中通過示例代碼給大家介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
mybatis mapper互相引用resultMap啟動出錯的解決
這篇文章主要介紹了mybatis mapper互相引用resultMap啟動出錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Springboot控制反轉(zhuǎn)與Bean對象的方法
文章介紹了Spring Boot中的控制反轉(zhuǎn)(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依賴關(guān)系,它詳細(xì)講解了Bean的注冊過程,包括通過@ComponentScan和@Bean注解的方式,并討論了Bean的依賴注入方法,如構(gòu)造器注入、Setter注入和字段注入,感興趣的朋友一起看看吧2025-03-03
Shiro + JWT + SpringBoot應(yīng)用示例代碼詳解
這篇文章主要介紹了Shiro (Shiro + JWT + SpringBoot應(yīng)用),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
詳解Spring框架下向異步線程傳遞HttpServletRequest參數(shù)的坑
這篇文章主要介紹了詳解Spring框架下向異步線程傳遞HttpServletRequest參數(shù)的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03

