问题描述:
在不同浏览器中下载文件,因为浏览器编码格式的不同导致文件名乱码。
解决:
public void export(HttpServletRequest request,HttpServletResponse response, @RequestParam Map
params) {
String fileName = encodeFileName(params.get("fileName").toString(),request);// 调用encodeFileName()方法对文件名进行编码转换
try {
// 以流形式下载文件
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 把创建好的workbook以字节流的形式写进缓冲中
// 读取os字节数组
InputStream is = new ByteArrayInputStream(os.toByteArray());
// 设置response弹出下载框
// 清空response
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;fileName="+ fileName);
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
BufferedInputStream bis = new BufferedInputStream(is);
// 获取缓冲数据
byte[] buffer = new byte[bis.available()];
int bytesRead;
while (-1 != (bytesRead = bis.read(buffer, 0, buffer.length))) {
toClient.write(buffer, 0, bytesRead);
}
toClient.flush();
bis.close();
toClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @Title: encodeFileName
* @Description: 导出文件转换文件名称编码
* @param @param fileNames
* @param @param request
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
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 ;
}