欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SrervletContext和文件下载

程序员文章站 2023-01-19 09:30:34
ServletContext对象 生命周期(从生命周期可以看出这个是个全局对象) 项目启动的时候创建 项目关闭的时候销毁 概念:代表整个web应用,可以和程序的容器(服务器)来通信。 获取 1. 通过request对象获取:request.getServletContext(); 2. 通过Http ......

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();
    }
}