JavaWeb學習(五)HttpServletResponse基本應用——檔案下載(4)
阿新 • • 發佈:2018-12-28
檔案下載功能是web開發中經常使用到的功能,使用HttpServletResponse物件就可以實現檔案的下載
一、檔案下載功能的實現思路:
(1)獲取要下載的檔案的絕對路徑
(2)獲取要下載的檔名
(3)設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案
(4)獲取要下載的檔案輸入流
(5)建立資料緩衝區
(6)通過response物件獲取OutputStream流
(7)將FileInputStream流寫入到buffer緩衝區
(8)使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器
二、工程樹:
三、程式碼:
/** * 1.ServletContext.getRealPath("/WEB-INF/download/1.png")是用來獲取伺服器上的某個資源, * 那麼這個"/"就是給伺服器用的,"/"此時代表的就是web工程 * ServletContext.getRealPath("/WEB-INF/download/1.png")表示的就是讀取web工程下的download資料夾中的1.png這個資源 * 只要明白了"/"代表的具體含義,就可以很快寫出要訪問的web資源的絕對路徑 */ this.getServletContext().getRealPath("/WEB-INF/download/1.png");
package com.servlet.study; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseD extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { downloadFileByOutputStream(response);//下載檔案,通過OutputStream流 } /** * 下載檔案,通過OutputStream流 * @param response * @throws FileNotFoundException * @throws IOException */ private void downloadFileByOutputStream(HttpServletResponse response) throws FileNotFoundException, IOException { //1.獲取要下載的檔案的絕對路徑 String realPath = this.getServletContext().getRealPath("/WEB-INF/download/1.png"); //2.獲取要下載的檔名 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); //3.設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案 response.setHeader("content-disposition", "attachment;filename="+fileName); //4.獲取要下載的檔案輸入流 InputStream in = new FileInputStream(realPath); int len = 0; //5.建立資料緩衝區 byte[] buffer = new byte[1024]; //6.通過response物件獲取OutputStream流 OutputStream out = response.getOutputStream(); //7.將FileInputStream流寫入到buffer緩衝區 while ((len = in.read(buffer)) > 0) { //8.使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器 out.write(buffer,0,len); } in.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
四、執行結果:
PS:
使用Response實現中文檔案下載:
下載中文檔案時,需要注意的地方就是中文檔名要使用URLEncoder.encode方法進行編碼(URLEncoder.encode(fileName, "字元編碼")),否則會出現檔名亂碼。
程式碼:
package com.servlet.study;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseD extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
downloadFileByOutputStream(response);//下載檔案,通過OutputStream流
}
/**
* 下載檔案,通過OutputStream流
* @param response
* @throws FileNotFoundException
* @throws IOException
*/
private void downloadFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
//1.獲取要下載的檔案的絕對路徑
String realPath = this.getServletContext().getRealPath("/WEB-INF/download/頂頂頂頂頂.png");//獲取要下載的檔案的絕對路徑
//2.獲取要下載的檔名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3.設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案,中文檔名要使用URLEncoder.encode方法進行編碼,否則會出現檔名亂碼
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
//4.獲取要下載的檔案輸入流
InputStream in = new FileInputStream(realPath);
int len = 0;
//5.建立資料緩衝區
byte[] buffer = new byte[1024];
//6.通過response物件獲取OutputStream流
OutputStream out = response.getOutputStream();
//7.將FileInputStream流寫入到buffer緩衝區
while ((len = in.read(buffer)) > 0) {
//8.使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器
out.write(buffer,0,len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
執行結果: