【Vue】使用Axios请求下载后端返回的文件流,并能够提示后端报错信息

【需求】使用Axios请求下载后端返回的文件流,下载失败时提示信息不写死,按照后端返回的信息进行提示。

一、需求分析

看到这个需求的时候,有人可能会很疑惑,这不是直接就能获取到吗,直接message.error()弹框就完事了,有什么问题。
我们先来模拟一下,点击按钮下载文件,请求后端接口,后端返回文件流,前端通常会设置响应类型为blob, responseType: 'blob',如:

// 下载文件
export function HandleDownLoadFile(params) {return request({url: '/xxxx/download',method: 'get',params,responseType: 'blob'});
}

我们打印响应数据看看是什么,可以发现res.data是一个Blob格式的数据,和正常的格式已经不同了,后端返回的message也获取不到了。

  • 文件流返回示例
    在这里插入图片描述

  • 正常数据返回示例
    在这里插入图片描述

二、解决问题

首先我我们先看下请求成功和失败的返回结果有无不同。
请求下载一个文件,请求成功时返回的是一个文件流,type是对应文件类型,例如:text/xml,正常导出文件;而请求失败的时候返回的是json ,type为application/json,不会处理错误信息,而是直接导出包含错误信息的文件。
但是无论成功还是失败,返回的结果都是blob格式的文件流。

因此可以通过返回的blob数据type类型进行区分,如果type是文件类型,导出文件,如果type是json则把blob数据转为string,处理错误信息。

在这里插入图片描述
在axios响应拦截器中,对二进制数据单独处理,如果type为application/json说明下载失败,那么弹出对应错误信息,然后返回Null,否则下载成功,正常返回res.data。

// 响应拦截器
service.interceptors.response.use(res => {...// 二进制数据处理if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {if (res.data.type === 'application/json') {const reader = new FileReader();reader.onload = () => {// TODO 错误处理this.$message.error(`Error: ${JSON.parse(reader.result).message}`);};reader.readAsText(res.data);return null;} else {return res.data;}}...
}

然后在通用下载函数中,首先进行判断,如果file存在,才开始下载操作。

export const DownloadFile = (file, fileName = 'file.xlsx') => {if (file) {const blob = new Blob([file]);// 获取heads中的filename文件名const downloadElement = document.createElement('a');// 创建下载的链接const href = window.URL.createObjectURL(blob);downloadElement.href = href;// 下载后文件名downloadElement.download = fileName;document.body.appendChild(downloadElement);// 点击下载downloadElement.click();// 下载完成移除元素document.body.removeChild(downloadElement);// 释放掉blob对象window.URL.revokeObjectURL(href);}
};

关键在于借助FileReader对象实现,FileReader.readAsText(data)开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。
读取操作完成时触发FileReader.onload(),在这里通过reader.result拿到读取的文件内容(即后端返回值),然后对其json序列化,即可拿到后端返回的message,然后进行相应的展示即可。
即下面这段代码:

if (res.data.type === 'application/json') {const reader = new FileReader();reader.readAsText(res.data);reader.onload = () => {// TODO 错误处理this.$message.error(`Error: ${JSON.parse(reader.result).message}`);};return null;
}

至此,问题解决。

总结

主要在于Blob格式返回错误怎么拿到的问题,通过type判断是否请求成功,然后借助FileReader对象读取blob格式文件内容,拿到需要的结果。

参考文章:https://blog.csdn.net/qq_27626333/article/details/103562749

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308377.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示: 背景需求: 大4班20号说:我不会做这种(九宫格),我做的是小格子的, 他把手工纸翻过来,在反面自己画了矩阵格子。向我展示:“我会做这种!” 原来他会…

阿里云2核2G3M服务器放几个网站?

阿里云2核2g3m服务器可以放几个网站?12个网站,阿里云服务器网的2核2G服务器上安装了12个网站,甚至还可以更多,具体放几个网站取决于网站的访客数量,像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码

这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制:通过Path、PathGeometry和PathFigure等元素组合,能够以声明方式精确描述长方体每个面的位置和形状,无需编写复杂的绘图逻辑,清晰直观。 层次结构与ZIndex控制…

nodejs+vue+微信小程序+python+PHP的林业信息管理系统的设计与实现-计算机毕业设计推荐

本文先充分调查林业信息管理系统的需求分析,深入剖析系统应该具有的功能,并设计完善的数据库。利用成熟的开发技术完成编码工作,林业信息管理系统可以为林业局领导提供业务管理功能,林业局领导也就是系统的管理员,具有…

彻底理解前端安全面试题(1)—— XSS 攻击,3种XSS攻击详解,建议收藏(含源码)

前言 前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 1 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这…

如何使用idea部署springboot项目全过程

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

【机器学习前置知识】Beta分布

Beta分布与二项分布的关系 Beta分布与二项分布密切相关,由二项分布扩展而来,它是用来描述一个连续型随机变量出现的概率的概率密度分布,表示为 X X X~ B e t a ( a , b ) Beta(a,b) Beta(a,b) , a 、 b a、b a、b 是形状参数。Beta分布本质上也是一个概率密度函数,只是这…

FairyGUI-Cocos Creator官方Demo源码解读

博主在学习Cocos Creator的时候,发现了一款免费的UI编辑器FairyGUI。这款编辑器的能力十分强大,但是网上的学习资源比较少,坑比较多,主要学习方式就是阅读官方文档和练习官方Demo。这里博主进行官方Demo的解读。 从gitee上克隆项目…

机器视觉在智能交通与无人驾驶领域的应用及前景

​引言 机器视觉算法对于智能交通系统和无人驾驶技术是十分重要的。机器视觉技术是无人驾驶汽车感知环境、做出决策的关键,它使得车辆能够理解周围的世界并安全地导航。在智能交通系统中,机器视觉也发挥着至关重要的作用,从提高交通效率到增…

分布式系统架构设计之分布式系统实践案例和未来展望

分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …

【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(二)

数组 什么是数组? 字面理解就是 数字的组合 其实不太准确,准确的来说数组是一个 数据的集合 也就是我们把一些数据放在一个盒子里面,按照顺序排好 [1, 2, 3, hello, true, false]这个东西就是一个数组,存储着一些数据的集合 …

SAP CO系统配置-与PS集成相关配置(机器人制造项目实例)

维护分配结构 配置路径 IMG菜单路径:控制>内部订单>实际过帐>结算>维护分配结构 事务代码 OKO6 维护结算参数文件 定义利润分析码