Servlet的三大域對象
-
request域對象
在一次請求中有效。請求轉發(fā)有效,重定向失效。
-
session域對象
在一次會話中有效。請求轉發(fā)和重定向都有效,session銷毀后失效。
-
servletContext域對象
在整個應用程序中有效。服務器關閉后失效。
文件上傳和下載
? 在上網(wǎng)的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等;當然除了上傳,遇見下載的情況也很多,接下來看看我們 servlet 中怎么實現(xiàn)文件的上傳和下載。
文件上傳
? 文件上傳涉及到前臺頁面的編寫和后臺服務器端代碼的編寫,前臺發(fā)送文件,后臺接收并保存文件,這才是一個完整的文件上傳。
前臺頁面
? 在做文件上傳的時候,會有一個上傳文件的界面,首先我們需要一個表單,并且表單的請求方式為 POST;其次我們的 form 表單的 enctype 必須設為"multipart/form-data",即 enctype="multipart/form-data",意思是設置表單的類型為文件上傳表單。默認情況下這個表單類型是 "application/x-www-form-urlencoded", 不能用于文件上傳。只有使用了multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。
<!--
文件上傳表單
1. 表單提交類型 method="post"
2. 表單類型 enctype="multipart/form-data"
3. 表單元素類型 文件域設置name屬性值
-->
<form method="post" action="uploadServlet" enctype="multipart/form-data">
姓名:<input type="text" name="uname" > <br>
文件:<input type="file" name="myfile" > <br>
<button type="submit">提交</button>
</form>
后臺實現(xiàn)
? 使用注解 @MultipartConfig 將一個 Servlet 標識為支持文件上傳。 Servlet 將 multipart/form-data 的 POST 請求封裝成 Part,通過 Part 對上傳的文件進行操作。
package com.xxxx.servlet;
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;
@WebServlet("/uploadServlet")
@MultipartConfig // 如果是文件上傳表單,一定要加這個注解
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 設置請求的編碼格式
request.setCharacterEncoding("UTF-8");
// 獲取普通表單項 (文本框)
String uname = request.getParameter("uname"); // "uname"代表的是文本框的name屬性值
// 通過 getPart(name) 方法獲取Part對象 (name代表的是頁面中file文件域的name屬性值)
Part part = request.getPart("myfile");
// 通過Part對象,獲取上傳的文件名
String fileName = part.getSubmittedFileName();
// 獲取上傳文件需要存放的路徑 (得到項目存放的真實路徑)
String realPath = request.getServletContext().getRealPath("/");
// 將文件上傳到指定位置
part.write(realPath + fileName);
}
}
文件下載
? 文件下載,即將服務器上的資源下載(拷貝)到本地,我們可以通過兩種方式下載。第一種是通過超鏈接本身的特性來下載;第二種是通過代碼下載。
超鏈接下載
? 當我們在 HTML 或 JSP 頁面中使用a標簽時,原意是希望能夠進行跳轉,但當超鏈接遇到瀏覽器不識別的資源時會自動下載;當遇見瀏覽器能夠直接顯示的資源,瀏覽器就會默認顯示出來,比如 txt、png、jpg 等。當然我們也可以通過 download 屬性規(guī)定瀏覽器進行下載。但有些瀏覽器并不支持。
默認下載
<!-- 當超鏈接遇到瀏覽器不識別的資源時,會自動下載 -->
<a href="test.zip">超鏈接下載</a>
指定 download 屬性下載
<!-- 當超鏈接遇到瀏覽器識別的資源時,默認不會下載。通過download屬性可進行下載 -->
<a href="test.txt" download>超鏈接下載</a>
? download 屬性可以不寫任何信息,會自動使用默認文件名。如果設置了download屬性的值,則使用設置的值做為文件名。當用戶打開瀏覽器點擊鏈接的時候就會直接下載文件。
后臺實現(xiàn)下載
實現(xiàn)步驟
需要通過 response.setContentType 方法設置 Content-type 頭字段的值, 為瀏覽器無法使用某種方式或激活某個程序來處理的 MIME 類型,例 如 "application/octet-stream" 或 "application/x-msdownload" 等。
需要通過 response.setHeader 方法設置 Content-Disposition 頭的值 為 "attachment;filename=文件名"
讀取下載文件,調用 response.getOutputStream 方法向客戶端寫入附件內容。
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.InputStream;
public class DownloadServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 設置請求的編碼
request.setCharacterEncoding("UTF-8");
// 獲取文件下載路徑
String path = getServletContext().getRealPath("/");
// 獲取要下載的文件名
String name = request.getParameter("fileName");
// 通過路徑得到file對象
File file = new File(path + name);
// 判斷file對象是否存在,且是否是一個標準文件
if (file.exists() && file.isFile()) {
// 設置響應類型 (瀏覽器無法使用某種方式或激活某個程序來處理的類型)
response.setContentType("application/x-msdownload");
// 設置頭信息
response.setHeader("Content-Disposition", "attachment;filename=" + name);
// 得到輸入流
InputStream is = new FileInputStream(file);
// 得到輸出流
ServletOutputStream os = response.getOutputStream();
// 定義byte數(shù)組
byte[] car = new byte[1024];
// 定義長度
int len = 0;
// 循環(huán) 輸出
while ((len = is.read(car)) != -1) {
os.write(car, 0, len);
}
// 關閉流 釋放資源
os.close();
is.close();
} else {
System.out.println("文件不存在,下載失?。?);
}
}
}
加VX了解<a >點我掃碼領取</a>
學習更多知識,請加入企鵝群:1080355292,入群暗號(33)