目录
1.目录结构
2.download页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载图片演示</title>
</head>
<body>
<h3>展示</h3>
<a href="/ThymeleafTest_war_exploded/images/图片1.jpeg">图片</a>
<a href="/ThymeleafTest_war_exploded/images/视频1.mp4">视频</a>
<hr>
<h3>下载</h3>
<a href="/ThymeleafTest_war_exploded/DownLoadServlet?filename=图片1.jpeg">图片</a>
<a href="/ThymeleafTest_war_exploded/DownLoadServlet?filename=视频1.mp4">视频</a>
</body>
</html>
3.DownLoadServlet
package servlets;
import utils.DownLoadUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数,文件名称
String filename=req.getParameter("filename");
//找到文件路径
ServletContext servletContext=this.getServletContext();
String realPath=servletContext.getRealPath("/images/"+filename);
FileInputStream fileInputStream=new FileInputStream(realPath);
//设置响应头类型
String mimeType=servletContext.getMimeType(filename);
resp.setHeader("content-type",mimeType);
//解决中文文件名
String agent=req.getHeader("user-agent");
filename= DownLoadUtils.getFileName(agent,filename);
//设置响应头打开方式
resp.setHeader("content-disposition","attachment;filename="+filename);
//将输入流的数据写到输出流
ServletOutputStream servletOutputStream=resp.getOutputStream();
byte[] buffer=new byte[1024*8];
int len=0;
while ((len=fileInputStream.read(buffer))!=-1){
servletOutputStream.write(buffer,0,len);
}
fileInputStream.close();
}
}
4.中文文件名处理类
jdk8之前
import sun.misc.Base64Encoder;
jdk8之后
import java.util.Base64;
package utils;
import java.util.Base64;
import java.util.Base64.Encoder;
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")) {
// 火狐浏览器
Encoder encoder =Base64.getEncoder();
filename = "=?utf-8?B?" + encoder.encodeToString(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}