Java Web文件下载案例

文件下载需求

  • 页面显示超链接
  • 点击链接之后弹出下载提示框
  • 完成图片文件的下载

分析

  • 超链接指向的资源能够被浏览器解析,则在浏览器当中展示,如果不能展示,则弹出提示框。这不满足需求
  • 需求:任何的资源都必须弹出提示框
  • 使用响应头设置资源的打开方式:content-disposition:attachment;filename=xxx

步骤

  • 编写超链接的href属性,指向一个servlet
  • 使用字节输入流加载文件进入内存
  • 指定response的响应头
  • 将数据输出到response的输出流即可
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>download</title>
</head>
<body>
<a href="/down?filename=d.jpg">点我下载文件</a>
</body>
</html>
package cn.web;

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(urlPatterns = {"/down"})
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String filename = req.getParameter("filename");
        ServletContext servletContext = this.getServletContext();
        String path = servletContext.getRealPath("/image/" + filename);
        FileInputStream fileInputStream = new FileInputStream(path);

        resp.setContentType(servletContext.getMimeType(filename));
        resp.setHeader("content-disposition", "attachment;filename=迪士尼.jpg");

        ServletOutputStream outputStream = resp.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        while((len = fileInputStream.read(buff)) != -1) {
            outputStream.write(buff, 0, len);
        }

        fileInputStream.close();
    }
}

文件名中文乱码问题的解决

  • 不同的浏览器会发生不同的中文乱码问题
  • 解决方法:使用工具类修改文件名即可
package cn.web;

import sun.misc.BASE64Encoder;

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")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}
  • 工具类的调用
resp.setContentType(servletContext.getMimeType(filename));
filename = DownLoadUtils.getFileName(req.getHeader("user-agent"), "迪士尼.jpg");
resp.setHeader("content-disposition", "attachment;filename=" + filename);
发布了96 篇原创文章 · 获赞 19 · 访问量 4333

猜你喜欢

转载自blog.csdn.net/qq_43446165/article/details/104300413
今日推荐