1. 程式人生 > >servlet下載檔案

servlet下載檔案

需求描述: 使用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")是為了解決中文檔名亂碼的問題

前端的訪問形式

在這裡插入圖片描述

web.xml配置

在這裡插入圖片描述