问题:java中用poi API进行Excel文件的下载,下载操作可以执行,可是最后发现下载的文件名称若为中文,则会出现乱码。
解决办法:
原因:ie浏览器下自动转码格式为gbk,而火狐、chrome等浏览器下的自动转码格式为utf-8
因而,在生成下载文件名时,只需根据不同的浏览器,对文件名进行转码即可。
直接上代码:
这里只贴生成文件名的代码:
/**
* 下载文件输出流 文件头设置
* @param response 服务器响应
* @param request 客户端请求
* @param contentType 头信息
* @param exportDto 下载实体信息
* @return
* @throws Exception
*/
private static OutputStream getWriteOutputStream(HttpServletResponse response, HttpServletRequest request) throws Exception {
response.reset();// 清空输出流
response.setContentType("application/ms-excel;charset=utf-8");
String fileName = encodeFileName("这里是你的文件名", request);
// attachment这个代表要下载的,如果去掉就直接打开了(attachment-作为附件下载,inline-在线打开)
// filename是文件名,另存为或者下载时,为默认的文件名
response.addHeader("Content-Disposition", "attachment; filename="+fileName);// IE下GBK,但是FireFox下UTF-8
return response.getOutputStream();
}
/**
* @param fileNames
* @param request
* @Description: 导出文件转换文件名称编码
*/
public static String encodeFileName(String fileNames, HttpServletRequest request) {
String codedFilename = null;
try {
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident") || null != agent && -1 != agent.indexOf("Edge")) {// ie浏览器及Edge浏览器
String name = java.net.URLEncoder.encode(fileNames, "UTF-8");
codedFilename = name;
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {
// 火狐,Chrome等浏览器
codedFilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
}
} catch (Exception e) {
e.printStackTrace();
}
return codedFilename;
}