Java-下载文件,文件名乱码问题
- 方法一
- 获取浏览器,配置编码格式
public static String getChinaFileName (HttpServletRequest request,String fileName){
// String fileName = LocalDate.now().toString()+".xls";
try {
HttpHeaders headers = new HttpHeaders();
String userAgent = request.getHeader( "User-Agent" );//获取浏览器
if (userAgent.contains("firefox")) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox
} else if (userAgent.contains("MSIE")) {
fileName = URLEncoder.encode(fileName, "UTF-8");// IE
}else if (userAgent.contains("CHROME")) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// Google
}
} catch (Exception e) {
e.printStackTrace();
}
return fileName;
}
- 方法二
- 直接拼接请求头 Header
response.setHeader("Content-disposition","attachment;filename=" + new String(fileName.getBytes("GBK"), "iso-8859-1"));
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
- 方法三
- 文件名存储
- 这种方法适合在本地生成临时文件,再去读取文件做现在,文件名称由获取的File.getName直接使用,尤其是封装到压缩包中,压缩包中文件名称乱码,这个时候其实乱码是生成的临时文件乱码导致的;
- 这个时候与引入的包没有关系,比如jdk的原生zip包,还是apache的zip包都解决不了问题;
- 处理办法:用一个容器存储两个文件名,一个为不会乱码的临时名称,一个为真实名称,这里建议用Map,打成压缩包之前临时文件的名称与容器中的临时名称对比,如果匹配,再将真实名称赋给需要压缩的文件做文件名。
随笔记录,方便自己学习
2020-05-21