@WebServlet(name = "downloadServlet", urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
String name = req.getParameter("name").trim();
System.out.println("name = " + name);
String mimeType = context.getMimeType(name);
resp.setContentType(mimeType);
String filename = URLEncoder.encode(name, StandardCharsets.UTF_8);
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
resp.setHeader("filename", filename);
System.out.println(resp.getHeader("Content-Disposition"));
InputStream resourceAsStream = context.getResourceAsStream("/upload/" + name);
PrintWriter out = resp.getWriter();
IOUtils.copy(resourceAsStream, out, StandardCharsets.UTF_8);
resourceAsStream.close();
}
}
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文件下载</title>
<script src="/webjars/axios/0.21.1/dist/axios.js"></script>
</head>
<body>
<h1>文件上传</h1>
<a href="/download?name=签名.png">下载 签名.png</a>
<br>
文件名:<label for="j_name"></label><input type="text" id="j_name">
<br>
<input type="button" id="j_btn" value="下载文件">
<br>
<img src="" id="img">
<script>
let btn = document.getElementById("j_btn");
btn.onclick = () => {
let name = document.getElementById("j_name").value;
let a = document.createElement('a');
axios({
method: 'get',
url: '/download',
params: {
name
}
}).then(data => {
let blob = new Blob([data.data]);
let a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = decodeURIComponent(data.headers.filename);
a.style.display = 'none';
document.body.append(a);
a.click();
a.remove();
});
};
</script>
</body>
</html>