MattTheTekie

通过接口下载文件

前言

今天接了个需求,用文件名去请求,然后后端返回数据回来,前端下载。以前都是 location 直接跳转下载。

下载

下载通过原生的 fetch 接口来进行,相关文档。因为原来请求是用 umi-request ,拦截器做了配置都不针对下载相关,所以会出问题,懒得改直接就封装一个 fetch 更方便

正常请求如下

export function downloadFileLink(link: string, fileName: string) {
  const a = document.createElement("a");
  document.body.appendChild(a);
  a.href = link;
  a.target = "_blank";
  a.download = fileName;
  a.click();
  a.remove();
  window.URL.revokeObjectURL(link);
}

async function downloadFile(url: string) {
  try {
    const result = await fetch(url, {
      method: "GET",
      headers: {}, // 自己的一些 token 相关
    });

    const blob = result.blob();
    const link = window.URL.createObjectURL(blob);
    downloadFileLink(blob, "下载名");
  } catch {
    // 相关的 catch 可以自行封装,fetch 只有在出现网络错误时会 catch
  }
}