- 背景
通过HttpServletResponse下载文件时,为防止文件名乱码,因而进行utf-8编码,然而谷歌浏览器部分版本会在下载时,未对英文括号及空格类字符进行解码,则导致文件名部分未解码。
2.策略
通过正则,匹配出中文,然后对中文进行编码。也就是不对英文解码,则就不存在英文部分符号无法解码,也不会出现中文乱码。
3.代码
//组装的完整文件名
String fileName = fileInfo.getFileName() + "." + fileInfo.getFileType();
//以正则匹配中文及对应字符
Pattern pattern = Pattern
.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]+");
Matcher matcher = pattern.matcher(fileName);
while (matcher.find()) {
String mStr = matcher.group();
try {
fileName = fileName.replaceFirst(mStr, URLEncoder.encode(mStr, "UTF-8"));
} catch (Exception e) {
}
}
ps. 补充通过HttpServletResponse进行文件下载的剩余代码,可适量参考。
//将文件转为byte数组的方法,可根据具体自行写此方法
byte[] fileBytes = getFileBytes(filePath);
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.addHeader("Content-Length", "" + fileBytes.length);
response.setContentType("application/octet-stream;charset=UTF-8");
response.getOutputStream().write(fileBytes);
response.getOutputStream().flush();
response.getOutputStream().close();