項目在google瀏覽器下都很nice了,但當測試到IE的時候開始出現各類問題。前端
項目是前端js經過URL傳參fileName到後臺解析返回ResponseEntity瀏覽器
前端代碼以下:tomcat
window.location.href="downPlan.do?fileName=fileName;
後臺代碼:app
@RequestMapping({"/downPlan.do"}) //@ResponseBody public ResponseEntity<byte[]> downPlan(HttpServletRequest request, @RequestParam("fileName") String fileName) throws Exception { String path = "C:/check/plan/"; String fName =fileName+".xlsx"; File file = new File(path + File.separator + fName); if(!file.exists()){ fName =fileName+".xls"; file = new File(path + File.separator + fName); } HttpHeaders headers = new HttpHeaders(); String downloadFielName = new String(fName.getBytes("UTF-8"), "iso-8859-1"); headers.setContentDispositionFormData("attachment",downloadFielName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
一、測試IE9下,出現錯誤:The valid characters are defined in RFC 7230 and RFC 3986,百度緣由好像是URL中包含了超出RFC 7230和RFC 3968所定義的字符測試
解決方法:能夠換tomcat的版本,過於麻煩google
或者修改tomcat配置文件編碼
我選了個最簡單的編碼 - 反編碼spa
前端修改爲code
window.location.href="downPlan.do?fileName="+encodeURI(encodeURI(fileName));
後臺反編碼便可orm
fileName = URLDecoder.decode(fileName,"UTF-8");
二、IE下載文件異常,文件名是URL的地址
異常以下圖:
廢話很少說:HttpStatus.CREATED改成HttpStatus.OK便可以,由於IE不支持201狀態
return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
三、下載文件會出現中文亂碼
文件能夠正常下載,可是出現亂碼就很煩了。
google能夠正常顯示,IE則會出現亂碼,header中只支持ASCII因此咱們傳輸的文件名必須是ASCII,
String downloadFielName = new String(fName.getBytes("UTF-8"), "iso-8859-1");
google能夠自動識別編碼方式,會對其進行反解碼,而IE則只會用GBK的方法,因此IE下載文件名仍是亂碼,改爲如下:
String downloadFielName = new String(fName.getBytes("GBK"), "iso-8859-1");
把UTF-8改爲GBK便可
詳情參考大神的博客:https://yq.aliyun.com/articles/38945