Rumah  >  Artikel  >  Java  >  SrervletContext对象的介绍和文件下载的实现代码

SrervletContext对象的介绍和文件下载的实现代码

不言
不言asal
2018-09-27 14:30:442523semak imbas

本篇文章给大家带来的内容是关于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();
        }
    }

    Atas ialah kandungan terperinci SrervletContext对象的介绍和文件下载的实现代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn