1. 程式人生 > >SrervletContext和文件下載

SrervletContext和文件下載

聯網 response tac 項目 fis sta exceptio web ref

ServletContext對象

  • 生命周期(從生命周期可以看出這個是個全局對象)
    • 項目啟動的時候創建
    • 項目關閉的時候銷毀
  • 概念:代表整個web應用,可以和程序的容器(服務器)來通信。
  • 獲取
    1. 通過request對象獲取:request.getServletContext();
    2. 通過HttpServlet獲取: this.getServletContext();
  • 功能
    1. 獲取MIME類型(文件的類型)
      • MIME類型:在互聯網通信過程中定義的一種文件數據類型
        • 格式是:大類型/小類型
      • String getMimeType(String file):根據文件的後綴名來判斷該文件的類型
    2. 域對象(共享所有用戶的數據)
      • setAttribute(String name,Object obj)
      • getAttribute(String name)
      • removeAttribute(String name)
    3. 獲取文件的真實(服務器)路徑
      • web下的文件:getRealPath("/文件名");
      • web/WEB-INF下:getRealPath("/WEB-INF/文件名");
      • src下:getRealPath("/WEB-INF/classes/文件名");

實現文件下載有個中文亂碼問題,所以先來個工具類

package cn.itcast.utils;

import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


public class DownLoadUtils {

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")) {
            // IE瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐瀏覽器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}

接下來就是servlet類的實現:

@WebServlet(name = "DownloadServlet",urlPatterns = "/download3")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.獲取文件名
        String filename = request.getParameter("filename");
        // 2.獲取真實路徑
        // 2.1 獲取ServletContext
        ServletContext servletContext = this.getServletContext();
        // 2.2 根據文件存儲的位置,選擇路徑,本人的路徑是web下的upload下的文件
        String realPath = servletContext.getRealPath("/upload/" + filename);
        // 3.設置響應頭
        // 3.1 設置content-type
        response.setHeader("content-type",servletContext.getMimeType(filename));
        // 3.2 解決中文亂碼
        String agent = request.getHeader("user-agent");
        filename = DownLoadUtils.getFileName(agent,filename);
        // 3.3 設置content-disposition
        response.setHeader("content-disposition","attachment;filename=" + filename);
        // 4.標準的IO流
        FileInputStream fis = new FileInputStream(realPath);
        ServletOutputStream sos = response.getOutputStream();
        byte[] b = new byte[1024 * 8];
        int len = 0;
        while((len = fis.read(b)) != -1){
            sos.write(b,0,len);
        }
        fis.close();
        sos.close();
    }
}

SrervletContext和文件下載