1. 程式人生 > >java web實現檔案下載

java web實現檔案下載

javaweb實現檔案下載

  • 實現檔案下載
  • 解決下載檔名帶有中文亂碼問題

效果圖

這裡寫圖片描述

這裡寫圖片描述

實現思路

根據請求連接獲取檔名和檔案型別,設定響應頭,獲取輸入流和輸出流

核心程式碼

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String fileName = request.getParameter("fileName");
        //獲得請求頭中的User-Agent
String agent = request.getHeader("User-Agent"); //根據不同瀏覽器進行不同的編碼 String fileNameEncoder = ""; if (agent.contains("MSIE")) { // IE瀏覽器 fileNameEncoder = URLEncoder.encode(fileName, "utf-8"); fileNameEncoder = fileNameEncoder.replace("+", " "
); } else if (agent.contains("Firefox")) { // 火狐瀏覽器 BASE64Encoder base64Encoder = new BASE64Encoder(); fileNameEncoder = "=?utf-8?B?"+ base64Encoder.encode(fileName.getBytes("utf-8")) + "?="; } else { // 其它瀏覽器 fileNameEncoder = URLEncoder.encode(fileName, "utf-8"
); } //告訴瀏覽器解析檔案的型別 response.setContentType(this.getServletContext().getMimeType(fileName)); //告訴瀏覽器不能解析檔案且適配各種瀏覽器提供檔案預設的名稱 response.setHeader("Content-Disposition", "attachment;filename="+fileNameEncoder); String realPath = getServletContext().getRealPath(fileName); InputStream in = new FileInputStream(realPath); ServletOutputStream out = response.getOutputStream(); int len = 0; byte[] bytes = new byte[1024]; while ((len = in.read(bytes)) > 0) { out.write(bytes, 0, len); } out.close(); in.close(); }

重點

  1. response.setHeader(“Content-Disposition”, “attachment;filename=”+fileNameEncoder); 實現強制下載
  2. response.setContentType(this.getServletContext().getMimeType(fileName)); 可以省略
  3. 解決檔名稱亂碼問題
    if (agent.contains(“MSIE”)) {
    // IE瀏覽器
    fileNameEncoder = URLEncoder.encode(fileName, “utf-8”);
    fileNameEncoder = fileNameEncoder.replace(“+”, ” “);
    } else if (agent.contains(“Firefox”)) {
    // 火狐瀏覽器
    BASE64Encoder base64Encoder = new BASE64Encoder();
    fileNameEncoder = “=?utf-8?B?”+ base64Encoder.encode(fileName.getBytes(“utf-8”)) + “?=”;
    } else {
    // 其它瀏覽器
    fileNameEncoder = URLEncoder.encode(fileName, “utf-8”);
    }