Java Web后端做文件的下载,各个浏览器之间有兼容性问题,下载文件的文件名可能有乱码,下面总结几个乱码问题和常见解决办法:
firefox文件名乱码的问题:
一般下载文件,都会指明Content-disposition,形如下
response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt");
但是这在firefox下,下载的文件名还是会乱码,这是因为firefox严格按照RFC的规定实现,对应的constent-disposition,是如下的格式:
response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(fileName,"UTF-8")+".txt");
所以对于不同的浏览器,就有判断了:
String userAgent=(String)request.getHeader("USER-AGENT");
if(useAgent.toLowerCase().contain("firefix")){
response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(fileName,"UTF-8")+".txt");
}else{
response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt");
}
中英文组合文件名在firefox下载显示不全
解决办法是在fileName外面包一层"
然后因为引号转移,需要加斜杠:
response.setHeader("Content-disposition","attachment;filename=\"" + fileName + "\"");
空格encode之后变成+号的问题
需要在encode之后,手动对+号替换,替换回urlencode的空格,也就是%20
fileName.replaceAll("+","%20");
总结
以上列举出来的,都是一些小技巧,我写完后觉得,如果要彻底解决文件名乱码的问题,最好的办法,还是认真对每一个浏览器做好针对性的解决办法,做成一个工具类。
其次是我上面写到的还是太少,更多内容,更细致的内容,还请看参考部分的博客,质量都很高