# 文件的上傳和下載 在上網的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等:當然除了上傳,遇見下載的情況 也很多,接下來看看我們servlet中怎麼實現文件的上傳和下載。 ## 文件上傳 文件上傳涉及到前臺頁面的編寫和後臺伺服器端代碼的編寫,前臺發送文件,後臺接收並保存文件,這才是 一個 ...
文件的上傳和下載
在上網的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等:當然除了上傳,遇見下載的情況
也很多,接下來看看我們servlet中怎麼實現文件的上傳和下載。
文件上傳
文件上傳涉及到前臺頁面的編寫和後臺伺服器端代碼的編寫,前臺發送文件,後臺接收並保存文件,這才是
一個完整的文件上傳。
前臺頁面
在做文件上傳的時候,會有一個上傳文件的界面,首先我們需要一個表單,並目表單的請求方式為POST;其次我們的form表單的enctype必須設為 "multipart/form-data",即enctype="multipart/form-data”,意思是設置表單的類型為文件上傳表單,預設情況下這個表單類型是 "application/.x-www-form-urlencoded",不能用於文件上傳,只有使用了multipart/form-data才能完整地傳遞文件數據。
前臺頁面代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上傳</title>
</head>
<body>
<!--
文件上傳
1. 準備表單
2. 設置表單的提交類型為 POST請求, method="post"
3. 設置表單的類型為文件上傳表單 enctype="multipart/form-data"
4. 設置文件提交的地址
5. 準備表單元素
1. 普通的表單項 type="text"
2. 文件項 type="file"
6. 設置表單元素的name屬性值(表單提交一定要設置表單元素的name屬性值,否則後臺無法接收數據)
-->
<form method="post" enctype="multipart/form-data" action="uploadServlet">
姓名:<input type="text" name="uname"><br>
文件:<input type="file" name="myfile"><br>
<!-- button按鈕的預設類型是 submit-->
<button>提交</button>
</form>
</body>
</html>
後臺實現
使用註解 @MultipartConfig 將一個Servlet標識為支持文件上傳。Servlet將multipart/form-data的
POST請求封裝成Part,通過Part對上傳的文件進行操作。
代碼實現:
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
/**
* @author: 86199
* @date: 2023/7/3 15:34
* Description: 文件上傳後臺代碼
*/
@WebServlet("/uploadServlet")
@MultipartConfig //如果是文件上傳,必須設置該註解
public class uploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件上傳....");
//設置請求的編碼格式
req.setCharacterEncoding("UTF-8");
//獲取普通表單項
String uname = req.getParameter("uname");
System.out.println("uname = " + uname);
//文件上傳表單
//獲取part對象(Servlet 會將 multipart/form-data 的Post請求封裝成一個Part對象)
Part part = req.getPart("myfile");
//獲取文件名
String fileName = part.getSubmittedFileName();
System.out.println("上傳文件名 " + fileName);
//文件存放路徑
String realPath = req.getServletContext().getRealPath("/");
System.out.println("文件存放路徑:" + realPath);
//上傳文件到指定目錄
part.write(realPath + "/" + fileName);
}
}
文件下載
文件下載
文件下載,即將服務留上的資源下載(拷貝)到本地,我們可以通過兩種方式下載。第一種是通過超鏈接本
身的特性來下載;第二種是通過代碼下載,
超鏈接下載
當我們在HTML或SP頁面中使用標簽時,原意是希望能夠進行跳轉,但當超鏈接遇到瀏覽器不識別的資源
時會自動下載:當遇見劉覽器能夠直接顯示的資源,瀏覽器就會預設顯示出來,比如txt、pg、jPg等。當然我們
也可以通過download屬性規定瀏覽器進行下載。但有些瀏覽器並不支持。
預設下載:
<!-- 當超時接遭到瀏覽器不識別的資時,會自動下載,遇到可識別會顯示其內容 -->
<a href="test.zip">文本文件</a>
指定download屬性下載:
<!--當超接遇到瀏覽器識別的資源時,預設不會下載,但是通過down1oad屬性可進行下載-->
<a href="test.txt download">文本文件</a
download屬性可以不寫任何信息,會自動使用預設文件名,如果設置了download屬性的值,則使用設置的
值做為文件名。當用戶打開瀏覽器點擊鏈接的時候就會直接下載文件。
後臺實現下載
實現步驟:
- 需要同通過 response.setContentType 方法設置 Content-typpe 頭欄位的值,讓瀏覽器無法使用某種方式或激活某個程式來處理的 MIME 類型,例如 "application/octet-stream" 或 "application/x-msdownload" 等。
- 需要通過 response.setHeader 方法設置 Content-Disposition 頭的值為 "attachment;filename=文件名"。
- 讀取需要下載的文件,調用 response.getOutputStream 方法向客戶端寫入附件內容。
代碼演示:
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author: 86199
* @date: 2023/7/3 17:07
* Description: 後臺代碼實現文件下載
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件下載...");
//設置請求編碼
req.setCharacterEncoding("UTF-8");
//獲取參數,獲取要下載的文件名
String fileName = req.getParameter("fileName");
//trim() 去除字元串前後的空格
if(fileName != null && "".equals(fileName.trim())){
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("請輸入要下載的文件名");
resp.getWriter().close();
return;
}
//獲取文件的存放路徑
String filePath = req.getServletContext().getRealPath("/download/");
File file = new File(filePath + fileName);
//判斷文件是否存在,並且是一個標準文件
if(file.exists() && file.isFile()){
//設置響應類型為瀏覽器不能識別的
resp.setContentType("application/x-msdownload");
//設置響應頭
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//得到文件輸入流
FileInputStream in = new FileInputStream(file);
//得到位元組輸出流
ServletOutputStream out = resp.getOutputStream();
byte[] bytes = new byte[1024];
int readLen = 0;
while ((readLen = in.read(bytes)) != -1){
out.write(bytes, 0, readLen);
}
in.close();
out.close();
}else {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("文件不存在請重試...");
resp.getWriter().close();
}
}
}