最近在做项目,采用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:解决不同浏览器上文件下载的中文名乱码问题
* @paramfilename导出/下载的文件的文件名
* @param request
* @param response
*/
publicstaticvoid contentDisposition(Stringfilename, StringuserAgent, HttpServletRequestrequest, HttpServletResponseresponse) {
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 (UnsupportedEncodingExceptione) {
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 |