您的位置:首页 > 编程语言 > Java开发

不同浏览器上中文文件名的下载/导出乱码问题(Java)

2017-12-06 00:00 465 查看
摘要: 最近在做项目,采用Spring Boot,下载文件/导出excel的中文文件名总是在主流浏览器上显示乱码。然后就去网上搜索相关解决办法,拿网上办法进行测试发现那些方法都已经不适用现在主流浏览器最新的版本了,于是经过自己琢磨、探索、尝试,最终得到了一个简洁、可实现的解决办法。现分享出来给大家,希望对你们有所帮助,如果对你有用,也希望你多多给予支持,在此先谢谢了。

最近在做项目,采用Spring Boot,下载文件/导出excel的中文文件名总是在主流浏览器上显示乱码。然后就去网上搜索相关解决办法,拿网上办法进行测试发现那些方法都已经不适用现在主流浏览器最新的版本了,于是经过自己琢磨、探索、尝试,最终得到了一个简洁、可实现的解决办法。现分享出来给大家,希望对你们有所帮助,如果对你有用,也希望你多多给予支持,在此先谢谢了。

下面就直接上代码:

/******************************************************************************

*如需转载请注明出处.

*****************************************************************************/

package com.zxm.util;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

/**

* @Title: ContentDispositionUtils.java

* @Package com.zxm.util

* @Description: 解决不同浏览器上中文文件名的下载乱码问题的工具类

* @author: zxm

* @date: 2017年12月4日 下午1:46:55

* @version V1.0

* @company: xxx

*/

public class ContentDispositionUtils {

private static Logger logger = Logger.getLogger(ContentDispositionUtils.class);

/**

* @Title: contentDisposition

* @Description: 解决不同浏览器上文件下载的中文名乱码问题

* @param filename 导出/下载的文件的文件名

* @param request

* @param response

*/

public static void contentDisposition(String filename, String userAgent, HttpServletRequest request, HttpServletResponse response) {

try {

response.reset();

response.setCharacterEncoding("UTF-8");

String newFilename = URLEncoder.encode(filename, "UTF-8").replace("+", " ");

String rtn = "filename=\"" + newFilename + "\"";

if (userAgent != null) {

userAgent = userAgent.toLowerCase();

if (userAgent.indexOf("edge") != -1) {

newFilename = URLEncoder.encode(filename, "UTF-8").replace("+", " ");

rtn = "filename=\"" + newFilename + "\"";

} else if (userAgent.indexOf("trident") != -1) {

rtn = "filename=\"" + newFilename + "\"";

} else {

rtn = "filename=\"" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\"";

}

}

response.setHeader("Content-Disposition","attachment;" + rtn);

} catch (UnsupportedEncodingException e) {

logger.error("UnsupportedEncodingException.");

}

}

}

/******************************************************************************

// 调用方法去调用上述工具类示例,以导出excel为例:

OutputStream out = null;

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

String userAgent = request.getHeader("USER-AGENT");

String filename = "统计数据" + ".xlsx";

// 设置文件名在不同主流浏览器上的编码

ContentDispositionUtils.contentDisposition(filename, userAgent, request, response);

******************************************************************************/

此工具类是在以下浏览器版本上经测试没问题,其他低版本还需要自己亲自去测试:

主流浏览器
User-Agent
Microsoft Edge 20.10240.17146.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240
IE 11
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Opera 49.0
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 OPR/49.0.2725.47
Safari 5.1.7
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 OPR/49.0.2725.47
Chrome 62.0.3202.94
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 OPR/49.0.2725.47
FireFox 57.0.1
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 OPR/49.0.2725.47
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息