在使用Safari下载中文名文件的时候,下载的文件名是乱码, 但在IE,Firefox,Chrome中下载时中文文件名可以正确显示
/**
* 浏览器下载文件时需要在服务端给出下载的文件名,当文件名是ASCII字符时没有问题当文件名有非ASCII字符时就有可能出现乱码
* 最终设置的response header是这样:
* Content-Disposition: attachment;
* filename="encoded_text";
* filename*=utf-8''encoded_text
* 其中encoded_text是经过RFC 3986的“百分号URL编码”规则处理过的文件名
*/
public static void setFileDownloadHeader(HttpServletResponse response, String filename) {
String headerValue = "attachment;";
headerValue += " filename=\"" + encodeURIComponent(filename) +"\";";
headerValue += " filename*=utf-8''" + encodeURIComponent(filename);
response.setHeader("Content-Disposition", headerValue);
}
/**
* 符合 RFC 3986 标准的“百分号URL编码”在这个方法里,空格会被编码成%20,而不是+和浏览器的encodeURIComponent行为一致
*/
public static String encodeURIComponent(String value) {
try {
return URLEncoder.encode(value, "UTF-8").replaceAll("\\+", "%20");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}