最近在做项目时,碰到一个需求,调接口,前端根据返回数流生成下载文件 。

1.首先进行封装在utils中,直接复制即可

export function dataToFile (params) {
  let type = params.type;
  let fileName = params.fileName;
  let data = params.data;
  // 兼容 IE
  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(new Blob([data]), fileName);
  } else {
    // 非IE 浏览器
    const url = window.URL.createObjectURL(new Blob([data], { type }));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', `${fileName}`);
    document.body.appendChild(link);
    link.click();
    window.URL.revokeObjectURL(url); // 释放内存
  }
}

2.接口,其中可以看到给接口添加了responseType,用来指定后台返回响应数据的类型,其中

arraybuffer‘返回的是包含二进制数据的JavaScriptArraybuffer。

 getAttachmentByNameList: (fileName, filePath) => axios.get('getAttachmentByName?fileName=' + fileName + '&filePath=' + filePath, {
    responseType: 'arraybuffer'
  })

3.一般下载都得首先去触发点击,点击后下载。点击时候去拿到下载文件的下载文件名,下载数据流,下载的类型,请求content-type 要设置为 application/octet-stream(二进制流数据),这样我们的的参数就全齐了

 getAttachmentByName (row) {
      let fileName = row.fullName;
      let filePath = row.fullPath;
      API.getAttachmentByNameList(fileName,fullPath).then((res) => {
        let params = {
          data: res.data,
          fileName: fileName,
          type: 'application/octet-stream;'
        };
        dataToFile(params);
      });
    },

4.拓展 ,在http请求中,一般接口相应得是200,数据类型还都是json格式,这个数据类型返回的是'ArrayBuffer',这时候需要去判断数据类型,从而去根据类型不去抛出错误 ,不去提示。

这里用到了对象原型链判断方法。不推荐使用 typeof 和 instanceof 去判断数据类型。如果数据类型是‘ArrayBuffer’,那么直接返回数据即可,不去抛出错误即可。

axios.interceptors.response.use(
  res => {
    let json = res.data;
    if (Object.prototype.toString.call(json) === '[object ArrayBuffer]') {
      return res;
    }  //判断是否是ArrayBuffer数据类型

    if (json && json.status !== '200' && json.status !== '10004') {
      APP.$message({
        message: json.err,
        type: 'error'
      });
    }
    return res;
  },
  error => {
    APP.$message({
      message: '请求异常',
      type: 'error'
    });
    return Promise.reject(error);
  }
);

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐