转:java下载文件时文件名乱码 – 智云一二三科技

方案一:将文件名编码为Unicode

fileName = URLEncoder.encode(fileName, "UTF-8");

文件名会转换为Unicode编码,在IE浏览器下测试正常,但是Firefox浏览器下测试得到的文件名是没有解码的Unicode。

方案二:将文件名编码为ISO-8859-1

fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

这种方式在IE下和Firefox下均可以得到中文文件名的文件。但如果文件名中带有空格,Firefox会从空格处截断文件名,需要在编码之前将文件名中的空格替换成下划线之类的可见字符。

fileName = new String(fileName.replace(" ", "_").getBytes("UTF-8"), "ISO-8859-1");

方案三:浏览器不兼容问题

在Java的web开发中,文件下载功能的文件名文件名乱码问题是经常遇到的。对于这个问题,不同的浏览器,解决的方法不太一样。

IE的话,通过URLEncoder对filename进行UTF8编码,而其他的浏览器(firefox、chrome、safari、opera),则要通过字节转换成ISO8859-1了。

if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {filename = URLEncoder.encode(filename, "UTF-8");
} else {    filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");
}

关于设置ISO8859-1编码文件名

转:下载文件设置header的filename要用ISO8859-1编码的原因 - 走看看

提取出来最核心的一点,filename=new String("中文文件名".getBytes("utf-8"), "ISO8859-1");

先说为什么使用 ISO8859-1 编码,这个主要是由于http协议,http header头要求其内容必须为iso8859-1编码,所以我们最终要把其编码为 ISO8859-1 编码的字符串;因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题

但是前面为什么不直接使用 "中文文件名".getBytes("ISO8859-1"); 这样的代码呢?

因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中文文件名".getBytes("ISO8859-1");来得到正确的“中文文件名”在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。

所以先通过 "中文文件名".getBytes("utf-8") 获取其 byte[] 字节,让其按照字节来编码,即在使用 new String("中文文件名".getBytes("utf-8"), "ISO8859-1") 将其重新组成一个字符串,传送给浏览器。

String.getBytes(String decode)

方法会根据指定的decode编码返回某字符串在该编码下的byte数组

new String(byte[], decode)

使用decode指定的编码来将byte[]解析成字符串。

String fileName = "测试";
fileName = new String(fileName.getBytes(), "ISO8859-1");
System.out.println("模拟传输:" + fileName);
//使用iso8859-1编码后 fileName 在这些字符传递到目的地后,目的地程序再通过相反的方式
fileName = new String(fileName.getBytes("ISO8859-1"));
System.out.println("前端得到的文件名:" + fileName);

结果:

模拟传输:æµè¯
前端得到的文件名:测试

java 下载文件名 编码相关推荐

  1. java下载文件名乱码的解决方法

    java下载文件名乱码的解决方法 参考文章: (1)java下载文件名乱码的解决方法 (2)https://www.cnblogs.com/liyabin/p/7891073.html 备忘一下.

  2. java文件名的编码格式_java下载文件名乱码解决方法详解

    java下载文件名乱码的方法:(推荐:java视频教程) 每个浏览器的编码不一样,火狐采用的是base64.ie和谷歌采用的是url编码: 所以我们在设置响应头的时候Content-Type getS ...

  3. JAVA中下载文件名含有中文乱码一种少见的解决方案

    原始代码(未处理含中文和空格的文件名) @RestController public class FileController {@RequestMapping(value = "/down ...

  4. Java下载文件时文件名出现乱码(但文件内容正常)

    今天写文件下载时,发现以前忽略的问题,写个小记录 我们一般使用中文操作系统,所以要求的 文件名编码最好是utf-8,国际化一点 但是,似乎实际上不是这样 1. String fileName=new ...

  5. java获取gbk文件名 linux_java获取真实的下载地址和下载文件名

    2010-04-14 比如有这样一个地址: http://www.vckbase.com/tools/downtools.asp?id=209 用下载工具打开时,能够知道其真实的下载地址和下载名称 请 ...

  6. java web 下载文件名乱码

    Web开发下载文件功能(代码如下),文件名如果带有中文,经常会出现乱码现象,需要进行编码. String fileName = "测试文件.doc"; try {HttpServl ...

  7. java 下载url图片_java下载url图片链接

    1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示 /** * 根据url路径下载图片 * @param filename 处理下载时显示设置好的中文名 ...

  8. java 文件名乱码_详解关于java文件下载文件名乱码问题解决方案

    JAVA文件下载时乱码有两种情况: 1,下载时中文文件名乱码 2,下载时因为路径中包含中文文件名乱码,提示找不到文件 解决方法见下面部分代码 response.setContentType(" ...

  9. java下载乱码怎么解决_java下载文件出现乱码怎么解决

    java下载文件出现乱码怎么解决 发布时间:2020-06-24 13:12:27 来源:亿速云 阅读:108 作者:Leah 这期内容当中的小编将会给大家带来有关java下载文件出现乱码的解决方法, ...

最新文章

  1. 全文解析:面向基于区块链的「机器人经济学」概念中,如何验证自主智能体的行为?...
  2. C++设计模式——单例模式
  3. .net自带的IOC容器MEF使用
  4. 不忽略空值null的聚合函数_sqlzoo 练习题答案 聚合函数 和 空值 部分
  5. 3DMine V202006体验版本下载
  6. 使用后处理Alpha通道丢失的问题
  7. 3ds Max 布尔(Boolean)运算——象棋的制作
  8. 达梦数据库解决ZYJ环境数据库连接会闪断的问题
  9. Codesys配置电子凸轮连接虚轴
  10. 笔记33 笨办法学python练习40之二:类和对象
  11. iPhone 等设备电池正式涨价!网友:“苹果是知道怎样割韭菜的……”
  12. 【web性能】获取web各个阶段响应时间:服务器响应时间、首页白屏时间、dom渲染完成时间等
  13. linux+记账软件下载,快速记账软件下载-快速记账appv3.11.0-Linux公社
  14. 自定义柱状图(水滴图)的填坑之路
  15. 通过Python终端输入命令对NAO机器人进行实时控制
  16. 立可得_第2章_新零售_重构人、货、场
  17. 【pytorch模型实现9】HAN_Attention
  18. 计算机 实验室安全准入制度,华东理工大学实验室安全准入制度
  19. 资讯:音频编解码器业界最新动态
  20. 微信小程序 解决按钮点击后e.currentTarget.dataset为空的方法

热门文章

  1. UWB数据处理——滤波的基本概念
  2. [转]Java中主线程如何捕获子线程抛出的异常
  3. 详解为整数添加千分符的正则表达式
  4. 关于计算机的作文1500字,关于计算机的科普作文:科普作文 1500字
  5. 等级保护制度已进入2.0时代,云等保标准颁布在即
  6. Golang if语句
  7. 干货分享,vova跨境电商平台引流及物流优势
  8. Python取代VBA?先问C#答应否
  9. 48V弱混技术要不要推广和应用
  10. Redis基础及原理详解