• 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

  • 相关阅读:
    C++中 destory() 和deallocate()以及delete函数的相关性和区别性
    由STL所想到的 C++显示调用析构函数
    MINIX3 内核整体架构回顾及内核定 性分析
    有一个无效 SelectedValue,因为它不在项目列表中
    SqlParameter.Value = NULL 引发的数据库异常
    前端解决跨域问题的8种方案(最新最全)
    SQL语句优化技术分析 整理他人的
    暂时未整理 已打印
    .Net_把文件数据添加到数据库中(面试题)
    ASP.NET中application对象的用法(面试题)
  • 原文地址:https://www.cnblogs.com/lwx521/p/10442499.html
Copyright © 2020-2023  润新知