关于浏览器下载文件名乱码问题

关于浏览器下载文件名乱码问题
在Web开发中,我们会写下面的(本文我以Chrome浏览器讲解,旨在讲解一些底层原理,为什么乱码,由于不同浏览器解码不同,所以我选择了Chrome为基础讲解)

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // req.setCharacterEncoding("utf-8");//设置获取参数的格式,但如果是Get方式不写特不会乱码,本次测试我没写
        String filename = req.getParameter("filename");//获取参数filename
        ServletContext servletContext = this.getServletContext();//获取域对象
        String mimeType = servletContext.getMimeType(filename);//获取Mime数据格式
        resp.setContentType(mimeType);//设置响应头
        
        
        resp.setHeader("content-disposition","attachment;filename="+filename);//这一步我标号为①
        
        
        String path = servletContext.getRealPath("image/"+filename);
        System.out.println(path);
        ServletOutputStream outputStream = resp.getOutputStream();
        System.out.println("图片");
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        }
        byte[] bt = new byte[1024 * 1024];
        fileInputStream.read(bt, 0, bt.length);
        fileInputStream.close();
        outputStream.write(bt, 0, bt.length);
        outputStream.close();

    }

在①这一步会发生这样的事情,Tomcat会默认的把(注意这里的编码格式不是content-type里设置来确定的)filename以ISO-8859-1转化为二进制流数据保存在响应头content-dispositin中然后给Chrome,Chrome会以UTF-8解码然后放在响应头中,之后在从刚刚放的响应头中再解码一次才是最终的文件名。过程如下图解如下:
代码模拟这一过程:
在这里插入图片描述在这里插入图片描述
在浏览器中:
在这里插入图片描述
解决办法:在①前加上:

filename = URLEncoder.encode(filename, "utf-8");

代码模拟这一过程:
在这里插入图片描述
在这里插入图片描述
浏览器结果:在这里插入图片描述
不同浏览器解码方式不同,但原理一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值