SrervletContext和文件下載
阿新 • • 發佈:2018-09-26
聯網 response tac 項目 fis sta exceptio web ref
ServletContext對象
- 生命周期(從生命周期可以看出這個是個全局對象)
- 項目啟動的時候創建
- 項目關閉的時候銷毀
- 概念:代表整個web應用,可以和程序的容器(服務器)來通信。
- 獲取
- 通過request對象獲取:request.getServletContext();
- 通過HttpServlet獲取: this.getServletContext();
- 功能
- 獲取MIME類型(文件的類型)
- MIME類型:在互聯網通信過程中定義的一種文件數據類型
- 格式是:大類型/小類型
- String getMimeType(String file):根據文件的後綴名來判斷該文件的類型
- MIME類型:在互聯網通信過程中定義的一種文件數據類型
- 域對象(共享所有用戶的數據)
- setAttribute(String name,Object obj)
- getAttribute(String name)
- removeAttribute(String name)
- 獲取文件的真實(服務器)路徑
- web下的文件:getRealPath("/文件名");
- web/WEB-INF下:getRealPath("/WEB-INF/文件名");
- src下:getRealPath("/WEB-INF/classes/文件名");
- 獲取MIME類型(文件的類型)
實現文件下載有個中文亂碼問題,所以先來個工具類
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和文件下載