檔案的上傳和下載
在上網的時候我們常常遇到檔案上傳的情況,例如上傳頭像、上傳資料等:當然除了上傳,遇見下載的情況
也很多,接下來看看我們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="https://www.cnblogs.com/zh-Note/archive/2023/07/12/test.zip">文本檔案</a>
指定download屬性下載:
<!--當超接遇到瀏覽器識別的資源時,默認不會下載,但是通過down1oad屬性可進行下載-->
<a href="https://www.cnblogs.com/zh-Note/archive/2023/07/12/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();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/557106.html
標籤:其他
上一篇:django相關知識
下一篇:返回列表