Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

 更新时间:2025年02月13日 16:57:19   作者:买火车的小男孩  
Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath, "UTF-8")`可以解决在提示下载框中正确显示汉字文件名的问题,但在选择直接打开时,文件名会变成乱码,解决这个问题的方法

Java下载文件中文文件名乱码问题

一般情况下,大家都是这样

fileName = URLEncoder.encode(fileName, "UTF-8");
response.reset();
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
response.setContentType("application/octet-stream; charset=UTF-8");
IoUtil.copy(inputStream, response.getOutputStream());

其实乱码就是乱在;filename=" + fileName这里,对文件名的编码设定上。

使用URLEncoder.encode(filepath,"UTF-8")虽然可以解决在提示下载框中正确显示汉字文件名的问题,并且在选择保存,然后打开的情况下,文件名称也可以正确的显示。

但是在提示下载框中,选择直接打开,则文件名称变成了类似这样的样子。

“%E7%BB%99%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E7%9A%84%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%90%8D”

为了解决这个问题

百度了好久,是这样的

String downloadfile = new String(filepath.getBytes("gb2312"),"iso8859-1");
response.addHeader("Content-Disposition","attachment;filename=" + downloadfile );

还有这样

String userAgent = request.getHeader("User-Agent");
String formFileName = "员工表.xls";

// 针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
formFileName = java.net.URLEncoder.encode(formFileName, "UTF-8");
} else {
// 非IE浏览器的处理:
formFileName = new String(formFileName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition",String.format("attachment; filename=\"%s\"", formFileName));
response.setContentType("multipart/form-data");
response.setCharacterEncoding("UTF-8");

发现都不能解决问题,不懈努力,崩溃边缘

最终解决

fileName = URLEncoder.encode(fileName, "UTF-8");
response.reset();
// fileName后面设置编码格式是重点
response.setHeader("Content-disposition", "attachment;filename="+fileName+";"+"filename*=utf-8''"+fileName);
response.setContentType("application/octet-stream; charset=UTF-8");
IoUtil.copy(inputStream, response.getOutputStream());

完美解决!!!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解maven中央仓库连不上的解决办法

    详解maven中央仓库连不上的解决办法

    这篇文章主要介绍了详解maven中央仓库连不上的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java的原子类无锁并发利器详解

    Java的原子类无锁并发利器详解

    这篇文章主要介绍了Java的原子类无锁并发利器详解,原子类同样能够解决互斥性问题、原子性问题除此之外,因为原子类是无锁操作,没有用互斥锁解决带来的加锁解决性能消耗,这种绝佳方案是怎么做到的呢,需要的朋友可以参考下
    2023-12-12
  • SpringBoot应用启动过程分析

    SpringBoot应用启动过程分析

    这篇文章主要介绍了SpringBoot应用启动过程分析,需要的朋友可以参考下
    2017-08-08
  • Java中ReentrantLock和ReentrantReadWriteLock的原理

    Java中ReentrantLock和ReentrantReadWriteLock的原理

    这篇文章主要介绍了Java中ReentrantLock和ReentrantReadWriteLock的原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • Java利用POI实现导入导出Excel表格示例代码

    Java利用POI实现导入导出Excel表格示例代码

    最近工作中遇到一个需求,是需要导出数据到Excel表格里,所以写个Demo测试一下,还是比较简单的,现在分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 解决idea check out 切换分支时找不到需要的分支问题

    解决idea check out 切换分支时找不到需要的分支问题

    这篇文章主要介绍了解决idea check out 切换分支时找不到需要的分支问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springboot使用hibernate validation对参数校验的实现方法

    springboot使用hibernate validation对参数校验的实现方法

    这篇文章主要介绍了spring-boot 使用hibernate validation对参数进行优雅的校验,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java从零开始创建功能丰富的PDF文档

    Java从零开始创建功能丰富的PDF文档

    随着数字化办公的普及,PDF格式因其跨平台兼容性和安全性而被广泛应用于各种场景中,本文将详细介绍如何使用Java来实现PDF文档的一键生成,有需要的可以了解下
    2025-01-01
  • IDEA查看Scala的源码的教程图解

    IDEA查看Scala的源码的教程图解

    这篇文章主要介绍了IDEA查看Scala的源码的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java代码实现微信页面滚动防露底(核心代码)

    Java代码实现微信页面滚动防露底(核心代码)

    这篇文章主要介绍了Java代码实现微信页面滚动防露底的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09

最新评论