java编写文件下载

一、有四种格式 txt /png/zip/mp4格式

这个地方 a 标签是get请求方式  传参数的话 在后面+?+参数

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a href="/WEB02/downloadservlet?filename=a.txt">a.txt</a>  // ?filename=a.txt  get是在请求行中 直接在后面拼接 key和value的值(值随便取名)

<a href="/WEB02/downloadservlet?filename=乔丹.png">乔丹.png</a>
    <a href="/WEB02/downloadservlet?filename=a.zip">a.zip</a> 
<a href="/WEB02/downloadservlet?filename=a.mp4">a.mp4</a>
</body>

</html>
复制代码

二、

复制代码
public class downloadservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取文件名
        String filename = request.getParameter("filename");
        // get请求解决乱码                                      
        filename = new String(filename.getBytes("ISO8859-1"), "utf-8"); //这个地方不写的话 下载中文版不能解析出来   如乔丹.png图片

        // 获取user-agent头
        String agent = request.getHeader("User-Agent");
        // 解决乱码
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
        }
        // 告知浏览器文件的类型
        response.setContentType(getServletContext().getMimeType(filename));
        // 告知浏览器文件的打开方式是下载
        response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
        // 获得文件所在服务器绝对路径
        String filepath = getServletContext().getRealPath("download/" + filename);
        // 明确数据源
        FileInputStream fis = new FileInputStream(filepath);
        // 明确目的地
        ServletOutputStream sos = response.getOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fis.read(bytes)) != -1) {
            sos.write(bytes, 0, len);
        }
        fis.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
复制代码

 

 3.页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同;

4.为解决这个乱码 编写了一个方法:

复制代码
// 获取user-agent头
        String agent = request.getHeader("User-Agent");
        // 解决乱码
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
        }
        // 告知浏览器文件的类型
        response.setContentType(getServletContext().getMimeType(filename));
        // 告知浏览器文件的打开方式是下载
        response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
复制代码

这样就完美的解决了 是中文的 txt /png/zip/mp4格式;

posted @   丿狂奔的蜗牛  阅读(300)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示