我們在項目中經常會用到下載功能,所以今天我們先說下下載功能實現的思路,然后通過一個案例代碼來具體體現。
1.下載的思路:
①首先要獲取我們要操作的文件對象的路徑
②然后使用獲取的文件對象路徑構建一個文件操作流對象
③設置好相關的http響應的頭,告訴瀏覽器怎么來操作我們寫回的數據,是下載、打開等等。
④通過response獲取字節流,並結合我們的文件流進行讀取和寫出操作
⑤關閉相關的流資源
2.下載具體servlet實現代碼:
package com.servlet; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/download.do") public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * 使用servlet實現文件下載功能 */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = "關系圖.jpg"; OutputStream out = null; FileInputStream fis = null; // 1.獲取資源文件的路徑,當文件名是中文的時候出現不正常的情況,所以需要進行url編碼 String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/servlet/" + URLEncoder.encode(fileName, "UTF-8")); try { // 2.根據獲取到的路徑,構建文件流對象 fis = new FileInputStream(path); out = response.getOutputStream(); // 3.設置讓瀏覽器不進行緩存,不然會發現下載功能在opera和firefox里面好好的沒問題,在IE下面就是不行,就是找不到文件 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "No-cache"); response.setDateHeader("Expires", -1); // 4.設置Content-type字段 response.setContentType("image/jpeg"); // 5.設置http響應頭,告訴瀏覽器以下載的方式處理我們的響應信息 response.setHeader("content-disposition", "attachment;filename=" + fileName); // 6.開始寫文件 byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { out.write(buf, 0, len); } } finally { if (fis != null) { fis.close(); } } } }
至此一個簡單的servlet實現下載功能已經實現完畢,有不足的地方,希望大家多多提意見!