前端下载二进制流数据

这里以axios请求演示:

 axios({
        url: url,
        method: 'get',
        params: parameter,
        headers: signHeader,
        //指定返回的数据类型
        responseType: 'arraybuffer',
      }).then(res=>{
        //application/vnd.openxmlformats-officedocument.wordprocessingml.document 》》》docx类型
        var blob = new Blob([res],
          {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'});
        var downloadElement = document.createElement('a');
        //创建下载的链接
        var href = window.URL.createObjectURL(blob);
        downloadElement.href = href;
        //下载后文件名
        downloadElement.download = 'hh.docx';
        document.body.appendChild(downloadElement);
        //点击下载
        downloadElement.click();
        //下载完成移除元素
        document.body.removeChild(downloadElement);
        //释放掉blob对象
        window.URL.revokeObjectURL(href);
        //加载loading
        this.downloadLoading = false;
      })
    }

说明:application/vnd.openxmlformats-officedocument.wordprocessingml.document  》》》指定文件类型

其他类型的文件参考:

  https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

有时候会发生后台校验,返回提示信息,这时候返回json数据,所以修改一下:

try里面处理json数据,catch里处理流数据

axios({
        url: url,
        method: 'get',
        params: parameter,
        headers: signHeader,
        //指定返回的数据类型
        responseType: 'arraybuffer',
      }).then(res=> {
        try {
          let enc = new TextDecoder('utf-8')
          let data = JSON.parse(enc.decode(new Uint8Array(res)))
          this.downloadLoading = false;
          this.$message.warning(data.message)
        } catch (err) {
          //application/vnd.openxmlformats-officedocument.wordprocessingml.document 》》》docx类型
          var blob = new Blob([res],
            { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8' });
          var downloadElement = document.createElement('a');
          //创建下载的链接
          var href = window.URL.createObjectURL(blob);
          downloadElement.href = href;
          //下载后文件名
          downloadElement.download = '请示.docx';
          document.body.appendChild(downloadElement);
          //点击下载
          downloadElement.click();
          //下载完成移除元素
          document.body.removeChild(downloadElement);
          //释放掉blob对象
          window.URL.revokeObjectURL(href);
          //加载loading
          this.downloadLoading = false;
        }
      })
    }
本人经验学识有限,不足之处还希望可以交流交流。
原文地址:https://www.cnblogs.com/tdyang/p/15314494.html