Springboot ResponseEntity IE无法正常下载文件

项目在google浏览器下都很nice了,但当测试到IE的时候开始出现各种问题。

项目是前端js通过URL传参fileName到后台解析返回ResponseEntity

前端代码如下:

window.location.href="downPlan.do?fileName=fileName;

后台代码:

@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);
}

 

1、测试IE9下,出现错误:The valid characters are defined in RFC 7230 and RFC 3986,百度原因好像是URL中包含了超出RFC 7230和RFC 3968所定义的字符

解决方法:可以换tomcat的版本,过于麻烦

或者修改tomcat配置文件

我选了个最简单的编码 - 反编码

前端修改成

window.location.href="downPlan.do?fileName="+encodeURI(encodeURI(fileName));

后台反编码即可

fileName = URLDecoder.decode(fileName,"UTF-8");

 

2、IE下载文件异常,文件名是URL的地址

异常如下图:

      

废话不多说:HttpStatus.CREATED改为HttpStatus.OK即可以,因为IE不支持201状态

return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);

3、下载文件会出现中文乱码

文件可以正常下载,但是出现乱码就很烦了。

 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

转载于:https://www.cnblogs.com/lwx521/p/10442499.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值