JavaWeb?Servlet實(shí)現(xiàn)文件上傳與下載功能實(shí)例
前言
在上網(wǎng)的時(shí)候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等;當(dāng)然除了上傳,遇見(jiàn)下載的情況也很多,接下來(lái)看看我們 servlet 中怎么實(shí)現(xiàn)文件的上傳和下載。
項(xiàng)目準(zhǔn)備
idea:2020.1
jdk:1.8
tomcat:10
項(xiàng)目模板:java Enterprise–>Web Application
文件上傳
文件上傳涉及到前臺(tái)頁(yè)面的編寫和后臺(tái)服務(wù)器端代碼的編寫,前臺(tái)發(fā)送文件,后臺(tái)接收并保存文件,這才是一個(gè)完整的文件上傳。
前臺(tái)頁(yè)面
在做文件上傳的時(shí)候,會(huì)有一個(gè)上傳文件的界面,首先我們需要一個(gè)表單,并且表單的請(qǐng)求方式為 POST;其次我們的 form 表單的 enctype 必須設(shè)為"multipart/form-data",即 enctype=“multipart/form-data”,意思是設(shè)置表單的類型為文件上傳表單。默認(rèn)情況下這個(gè)表單類型是 “application/x-www-form-urlencoded”, 不能用于文件上傳。只有使用了multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上傳</title> </head> <body> <!--文件上傳 1. 準(zhǔn)備表單 2.設(shè)置表單提交類型為POST method="POST" 3.設(shè)置表單類型為文件上傳表單 enctype="multipart/form-data" 4.設(shè)置文件提交地址 action地址需要和后臺(tái)servlet注解保持一致 5.準(zhǔn)備表單元素 6.設(shè)置表單元素的name屬性值(否則后臺(tái)無(wú)法接收數(shù)據(jù)) --> <form method="post" enctype="multipart/form-data" action="upLoadServlet"> 姓名:<input type="text" name="uname"><br> 文件:<input type="file" name="myfile"><br> <!--button默認(rèn)時(shí)提交類型 type="submit"--> <button>提交</button> </form> </body> </html>
后臺(tái)實(shí)現(xiàn)
? 使用注解 @MultipartConfig 將一個(gè) Servlet 標(biāo)識(shí)為支持文件上傳。 Servlet 將 multipart/form-data 的 POST 請(qǐng)求封裝成 Part,通過(guò) Part 對(duì)上傳的文件進(jìn)行操作。
package formServlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.MultipartConfig; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.Part; import java.io.IOException; /* * 文件上傳 * 1.使用注解@MultipartConfig,將servlet標(biāo)識(shí)為支持文件上傳 * 2.servlet將muitipart/form-data的POST請(qǐng)求封裝成part對(duì)象,通過(guò)part對(duì)文件上傳進(jìn)行操作 * */ @WebServlet("/upLoadServlet") @MultipartConfig //文件上傳注解 public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件上傳"); //設(shè)置請(qǐng)求編碼格式 req.setCharacterEncoding("UTF-8"); //獲取普通表單元素 String uname=req.getParameter("uname"); System.out.println("uname:"+uname); //獲取part對(duì)象 Part part=req.getPart("myfile"); //通過(guò)part對(duì)象獲得上傳文件名 String fileName = part.getSubmittedFileName(); System.out.println("file:"+fileName); //得到文件存放路徑 String filePath = req.getServletContext().getRealPath("/"); System.out.println("filePath:"+filePath); //上傳文件到指定路徑 part.write(filePath+"/"+fileName); } }
提交表單后查看控制臺(tái)打印結(jié)果
文件上傳
uname:張三
file:exception.jpg
filePath:E:\bdqn\JavaWeb\servlet\out\artifacts\servlet_war_exploded\
文件下載
? 文件下載,即將服務(wù)器上的資源下載(拷貝)到本地,我們可以通過(guò)兩種方式下載。第一種是通過(guò)超鏈接本身的特性來(lái)下載;第二種是通過(guò)代碼下載。
資源準(zhǔn)備
在web目錄下新建文件夾存放下載資源,通過(guò)tomcat配置添加Deployment到服務(wù)器中
超鏈接下載
? 當(dāng)我們?cè)?HTML 或 JSP 頁(yè)面中使用a標(biāo)簽時(shí),原意是希望能夠進(jìn)行跳轉(zhuǎn),但當(dāng)超鏈接遇到瀏覽器不識(shí)別的資源時(shí)會(huì)自動(dòng)下載;當(dāng)遇見(jiàn)瀏覽器能夠直接顯示的資源,瀏覽器就會(huì)默認(rèn)顯示出來(lái),比如 txt、png、jpg 等。當(dāng)然我們也可以通過(guò) download 屬性規(guī)定瀏覽器進(jìn)行下載。但有些瀏覽器并不支持。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件下載</title> </head> <body> <!-- 超鏈接下載 1.當(dāng)時(shí)用超鏈接(a標(biāo)簽)時(shí),如果遇到瀏覽器能夠識(shí)別的內(nèi)容,會(huì)顯示內(nèi)容,而不會(huì)進(jìn)行下載. 指定download屬性進(jìn)行下載; 2.如果遇到瀏覽器不能識(shí)別的內(nèi)容,會(huì)進(jìn)行下載 --> <!--瀏覽器能夠識(shí)別的資源,顯示內(nèi)容--> <a href="download/1.txt">文本文件</a> <a href="download/retrun.jpg">圖片文件</a> <!--壓縮文件是瀏覽器不能識(shí)別的資源,進(jìn)行下載--> <a href="download/1.zip">壓縮文件</a> <!--瀏覽器能夠識(shí)別的資源,設(shè)置download屬性,進(jìn)行下載--> <!--download="文件名.后綴名",不設(shè)置文件名和后綴名會(huì)默認(rèn)服務(wù)器中的文件屬性--> <a href="download/1.txt" download>文本文件下載</a> <a href="download/retrun.jpg" download="re.png">圖片文件下載</a> </body> </html>
? download 屬性可以不寫任何信息,會(huì)自動(dòng)使用默認(rèn)文件名。如果設(shè)置了download屬性的值,則使用設(shè)置的值做為文件名。當(dāng)用戶打開瀏覽器點(diǎn)擊鏈接的時(shí)候就會(huì)直接下載文件。
后臺(tái)實(shí)現(xiàn)下載
實(shí)現(xiàn)步驟
- 需要通過(guò) response.setContentType 方法設(shè)置 Content-type 頭字段的值, 為瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型,例 如 “application/octet-stream” 或 “application/x-msdownload” 等。
- 需要通過(guò) response.setHeader 方法設(shè)置 Content-Disposition 頭的值 為 “attachment;filename=文件名”
- 讀取下載文件,調(diào)用 response.getOutputStream 方法向客戶端寫入附件內(nèi)容。
package formServlet; import jakarta.servlet.ServletException; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * 文件下載 * 1. 需要通過(guò) response.setContentType 方法設(shè)置 Content-type 頭字段的值, 為瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型,例 如 "application/octet-stream" 或 "application/x-msdownload" 等。 * 2. 需要通過(guò) response.setHeader 方法設(shè)置 Content-Disposition 頭的值 為 "attachment;filename=文件名" * 3. 讀取下載文件,調(diào)用 response.getOutputStream 方法向客戶端寫入附件內(nèi)容。 */ @WebServlet("/downloadServlet") public class DownloadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件下載..."); //設(shè)置請(qǐng)求編碼格式 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); //獲取參數(shù)(下載文件名) String fileName = req.getParameter("fileName"); System.out.println(fileName); //參數(shù)非空判斷 trim():去除字符串的前后空格 if(fileName==null||"".equals(fileName.trim())){ //參數(shù)為空,寫入瀏覽器提示 resp.getWriter().write("請(qǐng)輸入要下載的文件名!"); resp.getWriter().close(); //關(guān)閉流 return; //退出當(dāng)前 } //得到文件存放路徑 String filePath=req.getServletContext().getRealPath("/download/"); //通過(guò)路徑得到file對(duì)象 File file = new File(filePath + fileName); //判斷文件對(duì)象是否存在并且是標(biāo)準(zhǔn)文件 if(file.exists()&&file.isFile()){ //設(shè)置響應(yīng)類型(瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型) resp.setContentType("application/x-msdownload"); //設(shè)置響應(yīng)頭 resp.setHeader("Context-Disposition","attachment;filename="+fileName); //得到file文件輸入流 FileInputStream fis = new FileInputStream(file); //得到字節(jié)輸出流 ServletOutputStream sos=resp.getOutputStream(); //定義byte數(shù)組 byte[] bytes=new byte[1024]; //定義長(zhǎng)度 int len=fis.read(bytes); //循環(huán)輸出 while (len!=-1){ sos.write(bytes,0,len); } //關(guān)閉資源 先打開的后關(guān)閉 sos.close(); fis.close(); }else { resp.getWriter().write("文件不存在,請(qǐng)重試!"); resp.getWriter().close(); } } }
總結(jié)
到此這篇關(guān)于JavaWeb Servlet實(shí)現(xiàn)文件上傳與下載功能的文章就介紹到這了,更多相關(guān)JavaWeb Servlet文件上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 異常的棧軌跡(Stack Trace)詳解及實(shí)例代碼
這篇文章主要介紹了Java 異常的棧軌跡(Stack Trace)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03編碼實(shí)現(xiàn)從無(wú)序鏈表中移除重復(fù)項(xiàng)(C和JAVA實(shí)例)
如果不能使用臨時(shí)緩存,你怎么實(shí)現(xiàn)無(wú)序鏈表中移除重復(fù)項(xiàng)(?C和JAVA實(shí)例無(wú)序鏈表中移除重復(fù)項(xiàng)。2013-10-10如何動(dòng)態(tài)替換Spring容器中的Bean
這篇文章主要介紹了如何動(dòng)態(tài)替換Spring容器中的Bean,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java設(shè)計(jì)模式模板方法(Template)原理解析
這篇文章主要介紹了Java設(shè)計(jì)模式模板方法(Template)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11