servlet下載檔案
阿新 • • 發佈:2019-01-07
需求描述: 使用servlet在服務端下載檔案
核心程式碼
package lhw.wanlin.content; import sun.misc.BASE64Encoder; 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.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; @WebServlet(name = "EncodeServlet") public class EncodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得要下載的檔案的名稱 String filename = request.getParameter("filename"); //美女.jpg //解決獲得中文引數的亂碼 // filename = new String(filename.getBytes("GBK"),"UTF-8"); // 設定要下載的檔案型別 response.setContentType(this.getServletContext().getMimeType(filename)); // 告訴瀏覽器不要解析次檔案直接下載 ,沒有這一行的話 瀏覽器會預設開啟.後面的 java.net.URLEncoder.encode(filename, "UTF-8")是把檔名子編碼,讓瀏覽器下載的時候檔名不會亂碼 response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8")); //獲取檔案的絕對路徑 String path = this.getServletContext().getRealPath("download/" + filename); //獲得該檔案的輸入流 InputStream in = new FileInputStream(path); //獲得輸出流 通過response獲得輸出流,用於向客戶端輸出內容 ServletOutputStream out = response.getOutputStream(); //檔案拷貝的模板程式碼 int len = 0; byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); // out.close(); } }
注意
- 其實從伺服器下載檔案就是一個讀取資料的過程,把檔案讀進快取,再把檔案寫到客戶端。
- 有一部分檔案瀏覽器會自動解析並開啟,不會下載。這個時候需要加上
response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
告訴瀏覽器不要解析該檔案,直接下載。沒有這一行的話,瀏覽器會預設開啟一部分型別的檔案,不會下載 java.net.URLEncoder.encode(filename, "UTF-8")
是為了解決中文檔名亂碼的問題