Servlet上傳文件

這是一個Maven項目

tomcat版本:9.0.107

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>FuncExt</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>FuncExt Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.20.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.6.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies><build><finalName>FuncExt</finalName></build>
</project>

Servlet.java

package Servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
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.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//判斷上傳的文件是普通表單還是帶文件的表單if(!ServletFileUpload.isMultipartContent(req)){System.out.println("普通表單");return;}//創建上傳文件的保存路徑,在WEB-INF路徑下,安全,用戶無法直接訪問String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);if(!uploadFile.exists()){uploadFile.mkdir();//創建臨時目錄}//緩存,臨時文件//臨時路徑String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");File tmpFile = new File(tmpPath);if(!tmpFile.exists()){tmpFile.mkdir();}try{//創建DiskFileItemFactory對象,處理文件上傳路徑或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile);//獲取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//處理上傳的文件String msg = uploadParseRequest(upload,req,uploadPath);//servlet請求轉發消息req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req,resp);} catch (Exception e){e.printStackTrace();}System.out.println("文件保存路徑:" + uploadPath);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public static DiskFileItemFactory getDiskFileItemFactory(File file){DiskFileItemFactory factory = new DiskFileItemFactory();//通過這個工廠設置一個緩沖區,上傳的文件大于這個緩沖區的話,將它放到臨時文件里factory.setSizeThreshold(1024 * 1024);// 1Mfactory.setRepository(file); //臨時文件的保存目錄return factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory diskFileItemFactory){ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);//監聽文件上傳進度upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long l, long l1, int i) {System.out.println("總大小:" + l1 + "已上傳:" + l);}});upload.setHeaderEncoding("UTF-8");upload.setFileSizeMax(1024 * 1024 * 10);upload.setSizeMax(1024 * 1024 * 10);return upload;}public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest request,String uploadPath) throws Exception{String msg = "";//把前端請求解析,分成一個一個文件List<FileItem> fileItems = upload.parseRequest(request);for(FileItem fileItem : fileItems){if(fileItem.isFormField()){String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(name + ":" + value);}else {String uploadFileName = fileItem.getName();System.out.println("上傳的文件名:" + uploadFileName);if(uploadFileName == null || uploadFileName.trim().equals("")){continue;}String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);System.out.println("文件信息【件名:" + fileName + "---文件類型" +  fileExtName + "】");String uuidPath = UUID.randomUUID().toString();String realPath = uploadPath + "/" + uuidPath;//給每個文件創建一個對應的文件夾;File realPathFile = new File(realPath);if(!realPathFile.exists()){realPathFile.mkdir();}InputStream inputStream = fileItem.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);byte[] b = new byte[1024 * 1024];int len = 0;while((len = inputStream.read(b)) != -1){fileOutputStream.write(b,0,len);}fileOutputStream.close();inputStream.close();msg = "文件上傳成功!";fileItem.delete();}}return msg;}
}

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"metadata-complete="true"><servlet><servlet-name>file</servlet-name><servlet-class>Servlet.Servlet</servlet-class></servlet><servlet-mapping><servlet-name>file</servlet-name><url-pattern>/upload</url-pattern></servlet-mapping>
</web-app>

index.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body><form action =  "${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">上傳用戶: <input type="text" name="username"> <br/><p><input type="file" name = "file1"></p><p><input type="file" name = "file2"></p><p> <input type = "submit"> | <input type="reset">  </p></form>
</body>
</html>

info.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>${msg}</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93813.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cocos creator 3.8 - 精品源碼 -《漢中漢:漢字中的字》

cocos creator 3.8 - 精品源碼 - 超級文字大師游戲介紹功能介紹免費體驗下載開發環境游戲截圖免費體驗游戲介紹 《漢中漢&#xff1a;漢字中的字》、找漢字&#xff0c;是一款從文字中的筆畫找出可以組成新漢字的小游戲。比如&#xff1a;“王”字中的筆畫就可以組成&#xff…

手機端的音視頻界面或者圖片文檔界面共享給大屏

手機端的音視頻界面或者圖片文檔界面共享給大屏&#xff0c;可通過無線投屏和有線連接等技術手段實現&#xff0c;以下是具體介紹&#xff1a;無線投屏&#xff1a;AirPlay&#xff1a;這是蘋果公司開發的無線共享協議。蘋果手機可通過上滑或下拉調出控制中心&#xff0c;點擊 …

Linux內存管理系統性總結

Linux內存管理系統性總結 內存管理核心架構圖 #mermaid-svg-hKRdgBBYXZTiost8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hKRdgBBYXZTiost8 .error-icon{fill:#552222;}#mermaid-svg-hKRdgBBYXZTiost8 .error-t…

MySQL 運算符實戰:9 道經典練習題解析

MySQL 運算符實戰&#xff1a;9 道經典練習題解析 運算符是 MySQL 查詢的 “靈魂”&#xff0c;靈活運用各類運算符能讓數據篩選更加精準高效。本文通過 9 道實戰練習題&#xff0c;詳解邏輯運算符、比較運算符及模糊匹配的用法&#xff0c;幫你快速掌握運算符的核心應用場景。…

【R語言】更換電腦后,如何在新設備上快速下載原來設備的 R 包?

【R語言】更換電腦后&#xff0c;如何在新設備上快速下載原來設備的 R 包&#xff1f; 在日常使用 R 進行數據分析時&#xff0c;我們往往會安裝很多包&#xff08;packages&#xff09;&#xff0c;一旦更換電腦&#xff0c;手動一個一個重新安裝會非常麻煩。本文介紹一種簡單…

如何在 Ubuntu 24.04 或 22.04 LTS 上安裝 PowerShell

在本教程中,我們將學習如何在 Ubuntu 24.04 Noble 或 22.04 Jammy JellyFish Linux 中通過命令終端安裝 Microsoft Windows PowerShell。 Windows PowerShell 既是一個命令行外殼程序,也是一種腳本語言。它擁有超過 130 個遵循一致語法和命名約定的命令行工具,稱為 cmdlet(…

基于支持向量機的數據回歸預測(libsvm) SVM

一、作品詳細簡介 1.1附件文件夾程序代碼截圖 全部完整源代碼&#xff0c;請在個人首頁置頂文章查看&#xff1a; 學行庫小秘_CSDN博客?編輯https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夾說明 1.2.1 main.m主函數文件 這段 MATLAB 代碼實現…

Flowith-節點式GPT-4 驅動的AI生產力工具

本文轉載自&#xff1a;Flowith-節點式GPT-4 驅動的AI生產力工具 - Hello123工具導航 ** 一、節點式 AI 工作流革新者&#xff1a;Flowith 深度解析 二、產品核心定位 Flowith 是一款基于 GPT-4 Turbo 的節點式 AI 生產力工具&#xff0c;突破傳統單線程聊天模式&#xff0c…

MySQL的事務日志:

目錄 redo&#xff08;重做日志&#xff09;&#xff1a; 特點&#xff1a; 組成&#xff1a; 整體流程&#xff1a; redo log buffer與redo log file之間的刷盤策略&#xff1a; 異步刷盤&#xff1a; 同步刷盤&#xff1a; 拆中策略&#xff1a; undo&#xff08;回…

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別,分別適合什么場景使用?

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別 在 JavaScript 中&#xff0c;throw 關鍵字用于拋出異常。當代碼遇到某些錯誤或異常情況時&#xff0c;可以通過拋出錯誤來通知程序&#xff0c;方便后續的錯誤處理。盡管 throw 的使用看似簡單&#xff0c…

鴻蒙自帶組件效果大全

圖形變換-視效與模糊-通用屬性-ArkTS組件-ArkUI&#xff08;方舟UI框架&#xff09;-應用框架 - 華為HarmonyOS開發者 注意:找到需求效果之后先對一下版本 視距 圖像效果 圖片裁剪 顏色漸變 前景屬性設置 外描邊設置: 視效設置: 組件內容模糊 運動模糊 點擊回彈效果…

ISP算法如何優化提升成像質量

ISP算法通過多維度技術協同優化成像質量&#xff0c;核心優化路徑如下&#xff1a;一、降噪與細節增強?AI驅動降噪?深度學習模型實時識別噪點模式&#xff0c;暗光場景信噪比提升5倍以上&#xff0c;同時保留紋理細節。時空域聯合降噪技術抑制運動模糊&#xff0c;鬼影消除率…

單例模式及優化

單例模式是一種創建型設計模式&#xff0c;其核心是確保一個類在程序中只能存在唯一實例&#xff0c;并提供一個全局訪問點。這種模式適用于需要集中管理資源&#xff08;如日志、配置、連接池&#xff09;的場景&#xff0c;避免資源沖突和重復創建的開銷。 一、介紹 類型 單例…

Dockerfile優化指南:利用多階段構建將Docker鏡像體積減小90%

更多如果你已經跟隨我們之前的教程&#xff0c;親手將自己的應用裝進了Docker這個“魔法盒子”&#xff0c;那你可能很快就會遇到一個幸福但又尷尬的煩惱&#xff1a;你親手構建的Docker鏡像&#xff0c;竟然像一個塞滿了石頭和棉被的行李箱&#xff0c;臃腫不堪&#xff0c;笨…

英文PDF翻譯成中文怎么做?試試PDF翻譯工具

在全球化快速發展的時代&#xff0c;跨語言交流變得愈發頻繁&#xff0c;無論是學術研究、商務合作還是日常學習&#xff0c;都離不開一個高效、準確的翻譯工具。尤其是對于PDF文件的翻譯需求&#xff0c;更是日益增長。今天&#xff0c;就讓我們一起深入了解幾款在PDF翻譯領域…

macOS使用brew切換Python版本【超詳細圖解】

目錄 一、更新Homebrew倉庫 二、安裝pyenv 三、將pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安裝需要的Python版本 六、設置全局使用的Python版本 七、檢查Python版本是否切換成功 pyenv常用命令 一、更新Homebrew倉庫 brew update 這個…

[矩陣置零]

初始思路分析 這段代碼實現了將矩陣中元素為0的行和列全部置零的功能。主要思路是使用標記數組記錄需要置零的行和列。以下是詳細分析&#xff1a; 1. 初始化階段 int m matrix.size(); int n matrix[0].size(); vector<bool> row(m), col(n);獲取矩陣的行數m和列數n創…

redis-集成prometheus監控(k8s)

一. 簡介&#xff1a; 關于redis的簡介和部署&#xff0c;可以參考單獨的文章redis-sentinel基礎概念及部署-CSDN博客&#xff0c;這里就不細說了。這里只講講如何在k8s中部署export并基于prometheus做redis的指標采集。 二. 實現方式&#xff1a; 首先我們需要先部署exporter…

OVS:ovn為什么默認選擇Geneve作為二層隧道網絡協議?

首先確認 Geneve 是一種封裝協議,可能提供比 VLAN 或 VXLAN 更靈活的擴展能力,這對 OVN 的多租戶場景很重要。可能需要支持更多元數據字段,比如攜帶網絡策略信息,這符合 SDN 集中控制的需求。 性能方面需要考慮封裝效率和硬件支持情況,雖然 Geneve 頭部稍大,但現代網卡的…

grep命令要點、詳解和示例

grep技術要點 1) 工作模型&#xff08;3 件事&#xff09; 輸入&#xff1a;從文件或標準輸入&#xff08;-&#xff09;讀入&#xff0c;一次按“行”處理&#xff08;除非用 -z 改成以 NUL 作為“行”分隔&#xff09;。匹配&#xff1a;把每一行拿去和模式&#xff08;patte…