SrervletContext和文件下载
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();
}
}