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

vue 导出excel接口请求和axios返回值blob类型处理

1. 导出功能vue文件代码

// 导出
const exportData = () => {
	const param = {
		warehouseId: warehouseId.value,
		dispatchType: dispatchType.value,
		beginTime: rangeTime.value?.length ? rangeTime.value[0] : undefined,
		endTime: rangeTime.value?.length ? rangeTime.value[1] : undefined
	}
	otherAPI.exportActionStatistics(param, 'blob').then((res: any) => {
		let fileName = '任务统计'
		let url = window.URL.createObjectURL(new Blob([res.data]))
		let link = document.createElement('a')
		link.style.display = 'none'
		link.href = url
		link.id = 'Adownload'
		link.setAttribute('download', `${fileName}.xlsx`) //命名可能会出现问题,格式一定和后端下载的格式一样
		document.body.appendChild(link)
		link.click()
	})
}

2. 接口方法代码

	// 任务导出
	exportActionStatistics(params: any, responseType: any) {
		const obj = {}
		if (params) {
			AiObject.cloneTo(params, obj)
		}
		return REST.request(HTTPMethod.GET, this.server + 'Statistics/ExportActionStatistics' + AiObject.toQueryString(obj), undefined, undefined, responseType)
	}

3. axios封装代码(REST.ts) 包含导出接口报错时返回blob的数据处理

const service = axios.create({
	headers: {
		// 'Access-Control-Allow-Origin': '*',
		// 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
		// 'content-Type': 'application/json; charset=utf-8'
	}
})

// 请求拦截
service.interceptors.request.use(
	(config: AxiosRequestConfig | any) => {
		// 增加一种情况授权,授权之后再登录
		if (window.sessionStorage.getItem('unlicensed') === '1') {
			// 系统未授权的判断要跑到未登录判断的前面。
		} else {
			const token = sessionStorage.getItem('token')
			if (token && config.headers) {
				config.headers.Authorization = token
			} else {
				Auth.singleton.logout()
			}
		}
		return config
	},
	(error: any) => {
		Promise.reject(error)
	}
)

// 响应拦截
service.interceptors.response.use(
	(response) => Promise.resolve(response),
	(error: any) => {
		// 授权失败
		if (error?.response?.status === HTTPStatus.Unlicensed) {
			window.sessionStorage.setItem('unlicensed', '1')
			Global.router.push({ path: '/lockdown' })
		} else if (error?.response?.status === HTTPStatus.Unauthorized) {
			Auth.singleton.logout()
		} else if (error && error.response) {
			if (error.response.data instanceof Blob) {
				// 针对 Blob 类型错误处理
				const res = error.response
				const fileReader: any = new FileReader()
				fileReader.readAsText(new Blob([res.data], { type: 'application/octet-stream' }), 'utf-8')
				fileReader.onload = () => {
					const { message } = JSON.parse(fileReader.result)
					ElMessage({
						showClose: true,
						message: message,
						type: 'error'
					})
				}
			} else {
				ElMessage({
					showClose: true,
					message: error.response.data.message,
					type: 'error'
					// duration: 0
				})
			}
		} else {
			ElMessage.error('连接到服务器失败,请联系管理员')
		}
		return Promise.reject(error)
	}
)

ResponseType传入判断 

	static request(method: HTTPMethod, url: string, params?: string | number | { [key: string]: any }, className?: string, responseType?: ResponseType): AxiosPromise {
		// 如果有className 就得额外增加进去。
		if (typeof className === 'string') url += className

		// 确保参数符合 AxiosRequestConfig 接口。
		const config: AxiosRequestConfig = {
			method
		}
		if (responseType) {
			config.responseType = responseType as any
		}

		switch (typeof params) {
			case 'number':
			case 'string':
				config.url = `${url}${params}`
				break
			case 'object':
				config.url = url
				config.data = params
				break
			default:
				config.url = url
				break
		}

		if (responseType) {
			config.responseType = responseType
		}

		return service(config)
	}


http://www.kler.cn/a/471540.html

相关文章:

  • 【AJAX详解】
  • (六)CAN总线通讯
  • C#开发——接口Interface
  • element输入框及表单元素自定义前缀
  • open61499符合新型工业控制测试要求吗
  • 概率基本概念 --- 离散型随机变量实例
  • Go语言的数据库交互
  • 最新版Chrome浏览器加载ActiveX控件之SolidWorks 3D控件
  • EasyExcel.read读取 Excel 文件
  • 第 24 章 网络请求与远程资源
  • WELL健康建筑认证在2025年相关消息
  • 网络安全主动防御技术与应用
  • 第14章 MySQL事务日志
  • 【物联网原理与运用】知识点总结(下)
  • 5G学习笔记之PNI-NPN
  • FastGPT 介绍
  • Olib开放图书 (zlibrary电子书在线搜索下载工具) 同步zlibrary
  • javaBC库冲突问题
  • 算能AI计算服务器SE5设备树的二次修改实操
  • 每天40分玩转Django:Django Docker化学习指南
  • 人工智能前沿探讨:从Transformer架构到机器意识与迁移学习的应用
  • 数据库模型全解析:从文档存储到搜索引擎
  • NodeJs 箭头函数:`()=>{}` 和 `()=>()` 的区别与使用场景
  • 使用ros_readbagfile脚本提取感兴趣的话题
  • Mac上鸿蒙配置HDC报错:zsh: command not found: hdc -v
  • 大风车excel:如何题库批量导入excel?批量导入