使用 axios 下载 后端返回的 zip(或者其他二进制文件)

vue项目使用axios下载后端返回的二进制文件流,以及使用form表单形式下载文件,两种方式对比总结

1.手动创建表单的形式

缺点:无法设置请求头参数,出现异常会跳转到表单提交的错误页面

优点:交给浏览器去处理下载的流程,无需关心过多操作

downloadQrcode() {
 const paramObj: any = {
    token: getToken(),
    orderId: this.orderId
  };

  const form = document.createElement('form');
  form.action = '接口地址';
  form.method = '请求类型';
  form.style.display = 'none';
  Object.keys(paramObj).forEach((key) => {
    const input = document.createElement('input');
    input.type = 'hidden';
    input.name = key;
    input.value = paramObj[key];
    form.appendChild(input);
  });
  const button = document.createElement('input');
  button.type = 'submit';
  form.appendChild(button);
  document.body.appendChild(form);
  form.submit();
  document.body.removeChild(form);
}

2. 使用axios实现异步下载文件

缺点:需要手动维护下载信息,比如下载按钮状态,接口请求时间可能较长

优点:可以设置请求头,可以进行下载拦截

import fileDownload from 'js-file-download';
import axios from 'axios';


axios.get(
  url,
  {
    params,
    headers: {
      'Content-Type': 'application/json; application/octet-stream'
    },
    responseType: 'blob'
  }
).then((res) => {
  const data = res.data;
  const fileReader = new FileReader();

  // 进行对象装换,避免将后端接口返回的错误信息也当成文件下载
  fileReader.onload = (event) => {
    try {
      const jsonData = JSON.parse(event.target.result);
      if (jsonData.status === 'fail') {
        // 解析成对象失败,说明是普通对象数据
        console.log(`下载提示: ${jsonData.message}`);
      }
    } catch (err) {
      // 解析成对象失败,说明是正常的文件流,可进行下载

      // 获取文件名
      const disposition = decodeURI(res.request.getResponseHeader('Content-Disposition'));
      let fileName = '';
      const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
      const matches = filenameRegex.exec(disposition);
      if (matches != null && matches[1]) {
        fileName = matches[1].replace(/['"]/g, '');
      }
      fileDownload(res.data, fileName);
    }
  };
  fileReader.readAsText(data);
}).catch((error) => {
  // 文件下载异常处理
});

除特别注明外,本站所有文章均为原创,转载请注明原文链接:https://www.myblogbo.com/article/27.html

 Top