首頁  >  文章  >  Java  >  SrervletContext物件的介紹和檔案下載的實作程式碼

SrervletContext物件的介紹和檔案下載的實作程式碼

不言
不言原創
2018-09-27 14:30:442541瀏覽

這篇文章帶給大家的內容是關於SrervletContext物件的介紹和文件下載的實作程式碼,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

ServletContext物件

生命週期(從生命週期可以看出這個是個全域物件)

專案啟動的時候創建

專案關閉的時候銷毀

概念:代表整個web應用,可以和程式的容器(伺服器)來通訊。

取得

1、透過request物件取得:request.getServletContext();

2、透過HttpServlet取得: this.getServletContext();

#功能

web下的檔案:getRealPath("/檔案名稱");

web/WEB-INF下:getRealPath("/WEB-INF/檔案名稱");

src下:getRealPath("/WEB-INF/classes/檔案名稱");

setAttribute(String name,Object obj)

getAttribute(String name)

removeAttribute(String name)

MIME類型:在互聯網通訊過程中定義的一種文件資料類型

String getMimeType(String file):根據檔案的後綴名來判斷該文件的類型

格式是:大類型/小類型

    1. # 取得MIME類型(檔案的型別)

    2. 網域物件(共享所有使用者的資料)

    3. 取得檔案的真實(伺服器)路徑

    ##實作檔案下載有個中文亂碼問題,所以先來個工具類別

    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物件的介紹和檔案下載的實作程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn