vue-axios下载文件流blob,ie下载报传递给系统调用的数据区域太小.ie文件流下载报错;文件下载失败将blob的错误信息转换成json格式

本次下载是后台文件流传输,前端下载,前端将拿到的下载id和名称downloadName传递给下载方法;如果是多个下载,可以采用数组for循环

情景描述:
1.如果符合导出条件, 后端直接返回数据流,如下图所示的一堆看不懂的东西:
在这里插入图片描述
在这里插入图片描述

2.不满足导出条件, 则后端返回JSON, 并附上失败原因, 前端需要将失败原因展示出来

解决问题:

  • 兼容ie浏览器下载报传递给系统调用的数据区域太小.
  • 解决blob下载文件,文件下载失败将blob的错误信息转换成json格式
    //下载
    downloadFile() {
      let obj = {
        loginUser: this.$store.state.loginUser,
        id: this.visibleId,
      };
      axios
        .post(
          this.$store.state.windowCONTENT + "myDownload/downloadFile",
          obj,
          {
            responseType: "blob",
          }
        )
        .then((res) => {
          // console.log(res.data.type);
          // alert(res.data.type);
          //此时有点两种情况,1.后端返回的是个对象而不是文件,但是被我们获取时候转成了blob,导致我们没法做判断。
          //例如{data:"参数异常,无下载权限",message:"INPUT_PARAMETER_CHECK_ERROR",success:7}
          //故需要将获取到的blob类型做判断,如果是application/json ---谷歌下的对象转blob的类型,或者application/json;charset=utf-8---ie下的对象转blob的类型
          //然后在再讲此blob转成原对象做判断
          if (res.data.type.includes('application/json')) {
            //以下部分代码是将原来的{}json对象转成的blob文件流,重新再读写成json对象做判断
            let reader = new FileReader()
            reader.onload = (event) => {
              let content = JSON.parse(reader.result)
              console.log(content);
              let message = content.message // 错误信息
              let status = content.success //状态码

              // 错误处理--根据后端实际返回的对象做判断
              if (status == 7) {
                alert(message);
              } else if (status == 9) {
              
              }
            }
            reader.readAsText(res.data)
            return true
          } else {
            if ("msSaveOrOpenBlob" in navigator) {//兼容ie浏览器下载报传递给系统调用的数据区域太小.
              var data = res.data;
              var blob = new Blob([data], { type: "application/vnd.ms-excel" });
              window.navigator.msSaveOrOpenBlob(blob, this.downloadName);
              return;
            } else {
              // console.log(res.data);
              const blob = res.data;
              const reader = new FileReader();
              reader.readAsDataURL(blob);
              reader.onload = (e) => {
                const a = document.createElement("a");
                a.download = this.downloadName; //点击下载时候传递过来的文件名称包括本身的格式 例如   帮助文档.doc
                a.href = e.target.result;
                // console.log(e.target.result);
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
              };
            }
          }
        })
        .catch((err) => {
          console.log(err.message);
        });
    },

2.地址栏方式下载:一般接口返回下载地址

    // 下载
    download(id) {
      queryPdf(id).then(res => {
        if (res.code === 200) {
          const a = document.createElement('a')
          a.style.display = 'none'
          a.setAttribute('href', res.data)
          a.click()
        }
      })
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值