前台请求后台下载文件防止文件因不同浏览器而乱码
乱码问题传送门
按照RFC2231
的定义,多语言编码的Content-Disposition应该这么定义:
Content-Disposition: attachment; filename*=“utf8’’%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt”
即:
- filename后面的等号之前要加 *
- filename的值用单引号
'
分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。 - 最好加上双引号,否则文件名中空格后面的部分在Firefox中显示不出来
后台方法
//防止下载时文件名乱码
try {
String filename= "表格 文件名有空格.xls";
//把要下载的文件转成字节数组
byte[] byteArray = FileUtils.readFileToByteArray(new File(filepath));
//文件名转码
filename = java.net.URLEncoder.encode(filename, "UTF-8");
//处理空格被转换为+的问题
filename = filename.replaceAll("\\+","%20");
//filename*=UTF-8'' 告诉客户端浏览器以utf8解码方式打开文件
resp.setHeader("Content-Disposition", "attachment;filename*=UTF-8''"+filename+"");
OutputStream outputStream = resp.getOutputStream();
IOUtils.write(byteArray, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
前台请求
function download() {
var url = "/controller/download.do";
window.open(encodeURI(url));
}