欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet实现文件下载

程序员文章站 2022-05-24 20:50:27
...
  • java 代码
@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);
        // 此处不要将 out 关闭,由 servlet 自行管理
        resourceAsStream.close();
    }
}
  • html 代码
<!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>