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());

完美解决!!!

总结

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

相关文章

  • jstorm源码解析之bolt异常处理方法

    jstorm源码解析之bolt异常处理方法

    下面小编就为大家带来一篇jstorm源码解析之bolt异常处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 使用Maven进行依赖排除的详细步骤

    使用Maven进行依赖排除的详细步骤

    在Maven中,依赖排除是一种常见的技术,用于从项目的依赖中排除特定的传递性依赖,这通常用于解决依赖冲突或避免引入不需要的库,以下是如何在Maven中使用依赖排除的详细步骤,包括代码示例,需要的朋友可以参考下
    2024-11-11
  • 堆排序算法的讲解及Java版实现

    堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下
    2016-05-05
  • Java Spring声明式事务失效情况解决办法(天翼通讯)

    Java Spring声明式事务失效情况解决办法(天翼通讯)

    在Spring的声明式事务中,多线程环境下事务会失效,因为子线程无法继承父线程的事务上下文,这篇文章主要介绍了Java Spring声明式事务失效情况解决办法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • Java中的多态、抽象类和接口详解

    Java中的多态、抽象类和接口详解

    这篇文章详细讲解了Java的多态、抽象类和接口,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java23种设计模式中的单例模式你了解吗

    Java23种设计模式中的单例模式你了解吗

    这篇文章主要为大家详细介绍了Java23种设计模式中的单例模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • SPRING IOC注入方式过程解析

    SPRING IOC注入方式过程解析

    这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringBoot+Querydsl 框架实现复杂查询解析

    SpringBoot+Querydsl 框架实现复杂查询解析

    本篇主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍,对SpringBoot Querydsl 查询操作感兴趣的朋友一起看看吧
    2022-05-05
  • 基于Java向zip压缩包追加文件

    基于Java向zip压缩包追加文件

    这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • RocketMQ生产者如何规避故障Broker方式详解

    RocketMQ生产者如何规避故障Broker方式详解

    这篇文章主要为大家介绍了RocketMQ生产者如何规避故障Broker方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论