vue根据路径下载文件/根据文件流下载文件

实现过程

// 下载
export const useFileDownload = (url, name) => {
  const x = new XMLHttpRequest();
  x.open("GET", url, true);
  x.responseType = "blob";
  x.onload = (e) => {
    const url = window.URL.createObjectURL(x.response);
    const a = document.createElement("a");
    a.href = url;
    a.download = name || "附件文件";
    a.click();
  };
  x.send();
};

//文件流下载
const sampleDownload=async()=>{
  const res = await 接口();
  if(res){
    const elink = document.createElement("a");
      elink.download = "信息模板.xlsx";
      elink.style.display = "none";
      const blob = new Blob([res], { type: "application/x-msdownload" });
      elink.href = URL.createObjectURL(blob);
      document.body.appendChild(elink);
      elink.click();
      document.body.removeChild(elink);
  }
}

//封装好的方法(通过响应头内获取文件名称   注意接口设置responseType: 'blob', getResponse: true)
export const downloadBlobWithResponse = (res) => {
  let fileName = '';
  const content = res.response.headers.get('content-disposition');

  if (content) {
    if (content.includes('utf-8') || content.includes('UTF-8')) {
      const name = content?.split('utf-8')?.[1] ?? content?.split('UTF-8')?.[1];
      fileName = decodeURIComponent(name);
    } else if (content.includes('filename=')) {
      let name = content.split('filename=')[1];
      // "的ASCII码为34,'的ASCII码为39
      if ([34, 39].includes(name?.[0]?.charCodeAt())) {
        fileName = name.slice(1, -1);
      } else {
        fileName = name;
      }
    }
  }

  const blob = new Blob([res.data]);
  let a = document.createElement('a');
  const url = window.URL.createObjectURL(blob);
  a.href = url;
  a.setAttribute('download', fileName);
  document.body.appendChild(a);
  a.click();
  window.URL.revokeObjectURL(url);
  a.parentNode.removeChild(a);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值