当前位置: 首页 > news >正文

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

导出文件的公共方法

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'));}
};

请求后端接口

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

接口请求

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', 导出文件是excelheaders: {'Accept': 'application/vnd.ms-excel',"locale": locale},//  获取返回数据结构里面包含response数据 如下图getResponse: true,}).then((res: any) => judgeErrorByResponseType(res)),);
}

接口返回结果
在这里插入图片描述

判断文件是否导出失败

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);}});
}
http://www.lryc.cn/news/323370.html

相关文章:

  • 哲♂学家带你深♂入了♂解结构体及结构体内存大小问题
  • 基于SSM的土家风景文化管理平台(有报告)。Javaee项目。ssm项目。
  • 2024年03月CCF-GESP编程能力等级认证C++编程一级真题解析
  • [Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模式))
  • 从Java到json:探索 Jackson 的魔力
  • Docker之docker compose!!!!
  • shardingsphere+达梦+jpa项目改造适配中遇到的一些问题与解决
  • YOLOV9训练自己的数据集
  • UG NX二次开发(C++)-CAM-获取加工操作的四种方法
  • python共享单车信息系统的设计与实现flask-django-php-nodejs
  • Python之Web开发中级教程----Django站点管理
  • Spring Boot项目中使用MyBatis连接达梦数据库6
  • Matlab快捷键与函数
  • 接雨水-热题 100?-Lua 中文代码解题第4题
  • JVM内存溢出排查
  • Leetcode 200. 岛屿数量
  • 多线程基础 -概念、创建、等待、分离、终止
  • 【Vue3】走进Pinia,学习Pinia,使用Pinia
  • 【TB作品】430单片机,单片机串口多功能通信,Proteus仿真
  • 【C++ leetcode】双指针问题
  • Kubernetes集群部署
  • 深拷贝与浅拷贝
  • golang学习网址
  • 2024学习鸿蒙开发,未来发展如何?
  • 3.21Code
  • 学习总结2
  • 【LeetCode】--- 动态规划 集训(一)
  • 【数据结构与算法】(18):树形选择排序:按照锦标赛的思想进行排序
  • 统计单词数
  • c++pair的用法