import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/*
Servlet实现文件的下载:
1.需要通过response.setContentType方法设置Content-type头字段的值,为浏览器无法使用某种方式或激活
某个程序来处理MIME类型,例如"application/octet-stream" 或 "application/x-msdownload"等
2.需要通过response.setHeader方法设置Content-Disposition头的值为 “attachment;filename=文件名”
3.读取下载文件,调用response.getOutputStream方法向客户端写入附件内容
*/
@WebServlet("/down")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求编码(Tomcat10及以上版本不用设置)
request.setCharacterEncoding("utf-8");
// 获取文件的下载路径
String path = getServletContext().getRealPath("/download/");
// 获取要下载文件的名称
String fileName = request.getParameter("fileName");
// 通过路径得到file对象
File file = new File(path + fileName);
// 判断file对象是否存在,且是否是一个标准文件
if (file.exists() && file.isFile()) {
// 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的类型)
response.setContentType("application/x-msdownload");
// 设置头信息
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 得到输入流
InputStream is = new FileInputStream(file);
// 得到输出流
ServletOutputStream os = response.getOutputStream();
// 定义byte[]
byte[] data = new byte[1024];
int len = 0;
while ((len = is.read(data)) != -1) {
os.write(data, 0, len);
}
is.close();
os.close();
} else {
System.out.println("文件不存在!无法下载!");
}
}
}