项目结构
代码;
/**
* @program: Servlet
* @description:Servlet 实现文件下载
* @author: stone
* @create: 2021-04-24 20:05
**/
public class DownloadServlet extends HttpServlet {
/*
步骤:
* 1.获取要下载的文件名
* 2.通过响应头告诉客户端返回的数据类型
* 3.通过响应头告诉客户端收到的数据是于下载使用
* 4.读取要下载的文件内容
* 5.把下载的文件内容传回客户端
* */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 要下载的文件名
String downloadFileName = "study.jpg";
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
// 获取下载的文件类型
String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
// 告诉客户端返回的数据类型
resp.setContentType(mimeType);
// 告诉客户端收到的数据用于下载使用(通过响应头)
// Content-Disposition 响应头,表示收到的数据怎么处理
// attachment 附件,表示下载使用
// filename= 表示指定下载的文件名,不一定和原文件名一样,可以改名,但是默认不支持中文,需要根据不同的浏览器做编码转换
if (req.getHeader("User-Agent").contains("Firefox")) {
// 如果是火狐浏览器使用Base64编码
resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode("好好学习.jpg".getBytes("UTF-8")) + "?=");
} else {
// 如果不是火狐,是IE或谷歌,使用URL编码操作
resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("好好学习.jpg", "UTF-8"));
}
// 第一个'/'被服务器解析表示地址为http://ip:port/工程名/ 映射到代码的web目录
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);
// 获取响应的输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 读取输入流中全部的数据,复制给输出流,输出给客户端
IOUtils.copy(resourceAsStream, outputStream);
}
}