https://blog.csdn.net/fengchao2016/article/details/55188805/
使用Trident和Edge关键字来判断是否是微软的浏览器(微软抛弃了IE,开始使用Edge了),在下载时,首先判断是否是微软的浏览器,如果是,用utf-8对文件名进行编码,如果不是,使用万能解决乱码。
public static void fileDownload(final HttpServletResponse response, String filePath, String fileName) throws Exception{
byte[] data = FileUtil.toByteArray2(filePath);
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
//解决下载文件时 中文文件名乱码问题
boolean isMSIE = isMSBrowser(request);
if (isMSIE) {
//IE浏览器的乱码问题解决
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
//万能乱码问题解决
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
outputStream.write(data);
outputStream.flush();
outputStream.close();
response.flushBuffer();
}
//判断是否是ie浏览器
private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
public static boolean isMSBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal))
return true;
}
return false;
}