JavaWeb中的文件的上傳和下載
文件上傳
1.要有一個form標(biāo)簽,method=post請求
2.form標(biāo)簽的encType屬性的值必須為multipart/form-data值
3.在from標(biāo)簽中使用input type=file添加上傳的文件
4.編寫服務(wù)器代碼接收上傳的數(shù)據(jù)
Content-Type:表示提交的數(shù)據(jù)類型
enctype="multipart/form-data":表示提交的數(shù)據(jù),以多段(每一個表單一個數(shù)據(jù)段)的形式進(jìn)行拼接,然后以二進(jìn)制流的形式發(fā)送給服務(wù)器
boundary:表示每段數(shù)據(jù)的分隔符
----WebKitFormBoundaryOZ1BoZwqflbGWUBH是由瀏覽器每次都隨機生成,他就是每段數(shù)據(jù)的分界符
package com.pero.file.file_upload; import jakarta.servlet.*; import jakarta.servlet.http.*; import java.io.IOException; public class UploadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("文件上傳"); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.pero.file.file_upload.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping> </web-app>
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2023/3/15 Time: 23:08 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="http://localhost:8080/file_Upload/uploadServlet" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="username"/> 頭像:<input type="file" name="photo"/> <input type="submit" value="上傳"> </form> </body> </html>
常用API
導(dǎo)入commons-fileupload-1.3.3.jar和commons-io-2.6.jar包到項目lib目錄下
常用類:
- ServletFileUpload類:用于解析上傳的數(shù)據(jù)
- FileItem類:表示每一個表單項
- boolean ServletFileUpload.isMultipartContent(HttpServletRequest request):判斷當(dāng)前上傳的數(shù)據(jù)格式是否為多段的格式
- public List<FileItem> parseRequest(HttpServletRequest request):解析上傳數(shù)據(jù)
- boolean isFormField():判斷當(dāng)前表單項是普通表單項還是上傳的文件類型,true表示表單項,false表示上傳的文件類型
- String getFieldName():獲取表單項的name屬性值
- String getString():獲取當(dāng)前表單項的值
- String getName():獲取上傳的文件名
- void write(File var1) throws Exception:將上傳的文件寫到參數(shù)file所指向的硬盤位置
文件上傳測試
package com.pero.servlet; 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 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.IOException; import java.util.List; public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); //先判斷上傳數(shù)據(jù)是否為多段數(shù)據(jù)(只有多段數(shù)據(jù)才是文件上傳的) if (ServletFileUpload.isMultipartContent(req)) { //創(chuàng)建FileItemFactory工廠實現(xiàn)類 FileItemFactory fileItemFactory = new DiskFileItemFactory(); //創(chuàng)建用于解析上傳數(shù)據(jù)的工具類 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); //解析上傳的數(shù)據(jù)得到每一個表單項Item try { List<FileItem> list = servletFileUpload.parseRequest(req); //循環(huán)判斷每一個表單項是普通類型還是上傳文件 for (FileItem fileItem : list) { if (fileItem.isFormField()) { //普通表單項 System.out.println("表單項的name屬性值:" + fileItem.getFieldName()); //參數(shù)UTF-8解決中文亂碼 System.out.println("表單項的value值:" + fileItem.getString("UTF-8")); } else { //上傳文件 System.out.println("表單項的name屬性值:" + fileItem.getFieldName()); System.out.println("上傳文件名:" + fileItem.getName()); fileItem.write(new File("G:\\test" + fileItem.getName())); } } } catch (Exception e) { throw new RuntimeException(e); } } } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.pero.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping> </web-app>
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2023/3/15 Time: 23:08 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="http://192.168.42.31:8080/Upload_Web/uploadServlet" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="username"/><br> 頭像:<input type="file" name="photo"/><br> <input type="submit" value="上傳"> </form> </body> </html>
文件的下載
客戶端發(fā)送請求告訴服務(wù)器需要下載什么文件,服務(wù)器過去要下載的文件名,讀取要下載的文件內(nèi)容,把下載的文件內(nèi)容回傳給客戶端,再回傳前,通過響應(yīng)頭告訴客戶端返回的數(shù)據(jù)類型,還要通過響應(yīng)頭告訴客戶端收到的數(shù)據(jù)是用于下載使用
常用API說明:
- response.getOutputStream():獲取響應(yīng)輸出流
- servletContext.getResourceAsStream():用于讀取要下載的內(nèi)容(返回對象為輸入流)
- servletCOntext.getMimeType():獲取要下載的文件類型
- response.setContentType():在回傳之前通過響應(yīng)頭告訴客戶端返回的數(shù)據(jù)類型
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("你好.png","UTF-8"));該響應(yīng)頭是告訴瀏覽器,這個文件是要下載的文件。attachment表示附件,也就是下載的文件,fileName=后面的表示下載的文件名
package com.pero.servlet.download_web; import jakarta.servlet.*; import jakarta.servlet.http.*; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; public class Download extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.獲取要下載的文件名 String downloadFileName = "1.png"; //2.讀取要下載的文件內(nèi)容(通過ServletContext對象讀取) ServletContext servletContext = getServletContext(); //獲取要下載的文件類型 String mimeType = servletContext.getMimeType("/file/" + downloadFileName); System.out.println("下載的文件類型:" + mimeType); //再回傳之前通過響應(yīng)頭告訴客戶端返回的數(shù)據(jù)類型 response.setContentType(mimeType); //還要告訴客戶端收到的數(shù)據(jù)是用于下載使用(還是使用響應(yīng)頭) //Content-Disposition響應(yīng)頭表示收到的數(shù)據(jù)怎么處理 //attachment表示指定下載的文件名 //url編碼是把漢字轉(zhuǎn)換成%xx%xx的格式 response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("你好.png","UTF-8")); InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName); //獲取響應(yīng)輸出流 OutputStream outputStream = response.getOutputStream(); //把要下載的文件內(nèi)容回傳給客戶端 //讀取輸入流中全部的數(shù)據(jù)賦值給輸出流,輸出給客戶端 IOUtils.copy(resourceAsStream, outputStream); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>Download</servlet-name> <servlet-class>com.pero.servlet.download_web.Download</servlet-class> </servlet> <servlet-mapping> <servlet-name>Download</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping> </web-app>
到此這篇關(guān)于JavaWeb中的文件的上傳和下載的文章就介紹到這了,更多相關(guān)JavaWeb文件上傳下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識解析
這篇文章主要介紹了Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Java日常練習(xí)題,每天進(jìn)步一點點(54)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞的實現(xiàn)詳解
這篇文章主要介紹了SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞,對于重定向,可以通過FlashMap或RedirectAttributes來在請求間傳遞數(shù)據(jù),因為重定向涉及兩個獨立的HTTP請求,而轉(zhuǎn)發(fā)則在同一請求內(nèi)進(jìn)行,數(shù)據(jù)可以直接通過HttpServletRequest共享,需要的朋友可以參考下2022-07-07mybatis實現(xiàn)增刪改查_動力節(jié)點Java學(xué)院整理
本文通過實例代碼給大家介紹了mybatis實現(xiàn)增刪改查功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09Java實現(xiàn)微信登錄并獲取用戶信息功能(開發(fā)流程)
這篇文章主要介紹了Java實現(xiàn)微信登錄并獲取用戶信息功能(開發(fā)流程),本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07SpringBoot+Prometheus+Grafana實現(xiàn)應(yīng)用監(jiān)控和報警的詳細(xì)步驟
這篇文章主要介紹了SpringBoot+Prometheus+Grafana實現(xiàn)應(yīng)用監(jiān)控和報警的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02