SrervletContext和文件下载

Posted 我想回家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
}

以上是关于SrervletContext和文件下载的主要内容,如果未能解决你的问题,请参考以下文章

我无法从 firebase 获取下载网址()。请任何人帮助这是我的代码和错误。 (我正在使用片段)[重复]

VSCode自定义代码片段2——.vue文件的模板

是否可以动态编译和执行 C# 代码片段?

VSCode 如何操作用户自定义代码片段(快捷键)

常用python日期日志获取内容循环的代码片段

Eclipse 中的通用代码片段或模板