zoukankan      html  css  js  c++  java
  • SrervletContext和文件下载

    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();
        }
    }
  • 相关阅读:
    评估您的网站/博客的价值
    Jquery从入门到精通:二、选择器 1、准备篇 (2)$()工厂方法
    JQuery核心:1.jQuery( expression, context )
    VS2008引用webservice的奇怪BUG解决方案
    Jquery从入门到精通:二、选择器 1、准备篇 1)基础的基础:DOM模型
    js实现html页面显示时间的定时刷新
    分页显示批量数据
    JSP与Access2010结合,实现数据的交互使用(re)
    通过datasource与数据库交互的jsp范例
    js练习V1
  • 原文地址:https://www.cnblogs.com/wadmwz/p/9528762.html
Copyright © 2011-2022 走看看