1. 程式人生 > >好記性不如爛筆頭13-使用HttpServletResponse實現檔案下載

好記性不如爛筆頭13-使用HttpServletResponse實現檔案下載

在JS中也可以實現檔案下載,但是在JS中的連結,很容易被盜鏈,而且容易造成攻擊。將檔案下載的連結放在JAVA端,能夠對使用者的請求進行更加多的校驗,能防止一部分的盜鏈和攻擊。

1、使用HttpServletResponse實現下載功能的實現

  1.獲取要下載的檔案的絕對路徑

  2.獲取要下載的檔名

  3.設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案

  4.獲取要下載的檔案輸入流

  5.建立資料緩衝區

  6.通過response物件獲取OutputStream流

  7.將FileInputStream流寫入到buffer緩衝區

  8.使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器

2、使用HttpServletResponse實現下載注意事項

檔案下載注意事項:編寫檔案下載功能時推薦使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是位元組流,可以處理任意型別的資料,而PrintWriter流是字元流,只能處理字元資料,如果用字元流處理位元組資料,會導致資料丟失。

下載中文檔案時,需要注意的地方就是中文檔名要使用URLEncoder.encode方法進行編碼(URLEncoder.encode(fileName, "字元編碼")),否則會出現檔名亂碼。

response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));

3、HttpServletResponse實現下載的原始碼

package com.servlet;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

 *通過HttpServletResponse實現簡單的檔案下載

 *

 *@author 範芳銘

 */

public class ResponseDownload extendsHttpServlet {

    publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        //1.獲取要下載的檔案的絕對路徑

        StringrealPath = this.getServletContext().getRealPath("/files/fxjh.jpg");

        //2.獲取要下載的檔名

        StringfileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

        //3.設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案

        response.setHeader("content-disposition","attachment;filename="

                +fileName);

        //4.獲取要下載的檔案輸入流

        InputStreamin = new FileInputStream(realPath);

        intlen = 0;

        //5.建立資料緩衝區

        byte[]buffer = new byte[1024];

        //6.通過response物件獲取OutputStream流

        OutputStreamout = response.getOutputStream();

        //7.將FileInputStream流寫入到buffer緩衝區

        while((len = in.read(buffer)) > 0) {

            //8.使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器

            out.write(buffer,0, len);

        }

        in.close();

    }

    publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        doGet(request,response);

    }

}