Servlet 入门—文件下载
今天来介绍下日常用的文件下载功能。
文件准备
在 web 模块下创建文件夹 img, 并准备一张图片。
写代码
1. 编写一个专门下载文件的 servlet
package top.lovezhangli.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Desc: DownloadServlet
* Author: xuhe
* Date: 2021/9/3 5:03 下午
* Version: 1.0
*/
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建字节输入流,关联读取的文件
// 1.1 获取文件的绝对路径
String realPath = getServletContext().getRealPath("/img/lyf.jpeg");
// 1.2 创建字节输出流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
//2.设置响应头支持的类型 应用支持的类型为字节流
/*
Content-Type 消息头名称 支持的类型
application/octet-stream 消息头参数 应用类型为字节流
*/
resp.setHeader("Content-Type","application/octet-stream");
//3.设置响应头以下载方式打开 以附件形式处理内容
/*
Content-Disposition 消息头名称 处理的形式
attachment;filename= 消息头参数 附件形式进行处理
*/
resp.setHeader("Content-Disposition","attachment;filename=" + System.currentTimeMillis() + ".png");
//4.获取字节输出流对象
ServletOutputStream sos = resp.getOutputStream();
//5.循环读写文件
byte[] arr = new byte[1024];
int len;
while((len = bis.read(arr)) != -1) {
sos.write(arr,0,len);
}
//6.释放资源
bis.close();
sos.close();
}
}
2. 在 web.xml 中 配置 servlet
将之前 loginServlet 的配置复制一份,改成下面的内容即可。
<servlet>
<servlet-name>downloadServlet</servlet-name>
<servlet-class>top.lovezhangli.servlet.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
3. 启动 tomcat 后验证
下载后打开文件:
至此,文件下载的功能就介绍完毕了,主要就是通过 response 对象设置 header 来实现的。
如果觉得还不错的话,关注、分享、在看(关注不失联~), 原创不易,且看且珍惜~