从后端获取文件数据并导出

导出文件的公共方法

javascript 复制代码
export const download = (res, tools) => {
  const { message, hide } = tools;
  const fileReader: any = new FileReader();
  console.log('fileReader-res>>>', res);
  fileReader.onload = (e) => {
    if (res?.data?.type === 'application/json') {
      try {
        const jsonData = JSON.parse(fileReader.result);
        if (jsonData?.success === false && jsonData?.message) {
          hide?.();
          message.error(jsonData?.message);
        }
      } catch (error) {
        hide?.();
        message.error(getLocalTextFun('common.export.error'));
      }
    } else {
      try {
        const filename = (
          res.response.headers.get('content-disposition').split('filename=')?.[1] || ''
        ).replace(/"/g, '');
        if ('msSaveOrOpenBlob' in navigator) {
          window.navigator.msSaveOrOpenBlob(res.data, decodeURI(filename));
        } else {
          const blob = new Blob([res.data]);
          const url = window.URL.createObjectURL(blob);
          const link: any = document.createElement('a');
          link.href = url;
          link.download = decodeURI(filename);
          link.click();
          hide?.();
          window.URL.revokeObjectURL(url);
        }
      } catch (err: any) {
        hide?.();
        message.error(getLocalTextFun('common.export.error'));
      }
    }
  };
  try {
    fileReader.readAsText(res.data);
  } catch (e) {
    hide?.();
    message.error(getLocalTextFun('common.export.error'));
  }
};

请求后端接口

javascript 复制代码
const hide = message.loading(`加载中...`, 0);
const res = await exportI18nByLocal(record.locale);
download(res, {message, hide});

接口请求

javascript 复制代码
export async function executeAndTryCatch(func: any) {
  try {
    return await func();
  } catch (error: any) {
    return error;
  }
}
export function exportI18nByLocal(locale:string) {
  return executeAndTryCatch(() =>
    request<Record<string, any>>(`${api().i18nExport}?locale=${locale}`, {
      method: 'GET',
      responseType: 'blob',
      //'Accept': 'application/vnd.ms-excel', 导出文件是excel
      headers: {
        'Accept': 'application/vnd.ms-excel',
        "locale": locale
      },
      //  获取返回数据结构里面包含response数据 如下图
      getResponse: true,
    }).then((res: any) => judgeErrorByResponseType(res)),
  );
}

接口返回结果

判断文件是否导出失败

javascript 复制代码
function judgeErrorByResponseType(response: any) {
  const res = response.response;
  return new Promise((resolve, reject) => {
    if (!res) resolve('');
    if (res.headers.get('Content-Type').includes('json')) {
      const reader = new FileReader();
      reader.onload = () => {
        const { result }: any = reader;
        const errorInfos = JSON.parse(result);
        resolve(errorInfos);
      };
      reader.onerror = (err) => {
        reject(err);
      };
      reader.readAsText(response.data);
    } else {
      resolve(response);
    }
  });
}
相关推荐
我命由我1234519 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng34 分钟前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
LaughingZhu1 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
Lank_M1 小时前
抠图结果缩放后边缘发脏,该怪的不是插值
前端
jerrywus2 小时前
Skill、MCP、Workflow、Rules、Memory 有什么区别?拿几次真实开发任务讲清楚
前端·agent·claude
补码缩写2 小时前
canvas 与 sharp 缩放透明图:默认预乘,非预乘得拆通道
前端
静默回滚2 小时前
抠图 PNG 缩小再放大,边缘又糊又白是两件事
前端
用户11977079480732 小时前
GitHub 电商开源项目分享:用 sharp 批量出饰品主图,试了裁剪、细节图和色彩配置文件三个坑
前端·node.js
deli0072 小时前
地图定位为什么偏了 500 米?GPS 与火星坐标实测
前端
TK泰妞2 小时前
节日促销前,TikTok 商品视频应该提前准备什么?
前端·人工智能·节日