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