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

VUE 文件下载,流形式的文件下载,判断返回的是流还是JSON;获取下载名称

        在前端中,有很多下载文件的情况,在大多数情况下,后端是以流的形式把需要的数据返回给前端,这就有接口报错的情况在里面,如果接口报错,有的后端则会返回一个带有错误信息的JSON给我们,比如下面这样:

{code: "-1",data: null,message:"没有数据导出!"
}

所以我们在封装axios的时候,需要在请求拦截中做一些处理:

service.interceptors.response.use((response) => {if (response.config.responseType === 'blob') {const contentType = response.headers['content-type']// 情况1:收到的是文件流(正常下载)if (contentType.includes('excel')) {// 方式 1:从自定义头获取const filenameFromHeader = response.headers['filename'];// 方式 2:从 Content-Disposition 解析const contentDisposition = response.headers['content-disposition'];const filenameFromCD = contentDisposition?.split('filename=')[1]?.replace(/"/g, '');return {blob: response.data, // 二进制数据filename: decodeURIComponent(filenameFromHeader || filenameFromCD // 从header获取文件名)}}// 情况2:收到的是错误信息(需要转换)return new Promise((resolve, reject) => {const reader = new FileReader()reader.onload = () => {try {const json = JSON.parse(reader.result)if (json.status !== 200) { // 根据你的错误码约定调整reject(json.message || '下载失败')}}catch (e) {console.log('e==>', e);reject('响应解析失败')}}reader.readAsText(response.data)})}return response.data
}, err)

当然,在封装我们的下载方法的时候,也要记得给responseType加上blob

export function functionName(parameter) {return axios({url: '/api/XiaZaiDiZhi',method: 'post',data: parameter,responseType: 'blob'})
}

在调用方法的时候,如果接口报错,返回了JSON,我们就可以直接在catch中获取到报错信息,也可以获取到我们所需要的文件名称

//调用接口
functionName(fromsData).then((data) => {const fileName = data.filename;const url = window.URL.createObjectURL(data.blob);const a = document.createElement("a");a.href = url;a.download = fileName;document.body.appendChild(a);a.click();window.URL.revokeObjectURL(url);}).catch((err) => {this.$message.error(err);});

相关文章:

  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.10)
  • React中常用的钩子函数:
  • go语言基础
  • 交叉编译DirectFB报错解决方法
  • 【VLNs篇】04:SayNav-为新环境中的动态规划到导航进行大型语言模型的基础构建
  • 抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案
  • 手机合集(不定期更新)
  • 【未来展望】云、AI与元宇宙的融合架构
  • 【NLP 77、Python环境管理工具之conda】
  • App开发中为什么import android.app.Activity;
  • Python打卡训练营day33——2025.05.22
  • 封装红黑树实现mymap和myset
  • Pinia持久化存储插件, 持久化存储插件安装(超详细教程)
  • c/c++的opencv腐蚀
  • 如何解决鸿蒙应用闪退问题
  • ABP VNext + Elasticsearch 实战:微服务中的深度搜索与数据分析
  • 软件开发技术文档范文
  • Python训练打卡Day31
  • 8天Python从入门到精通【itheima】-29~31
  • [Memory] 01.QEMU 内存虚拟化概览
  • 如何维护网站的运营/seo快速排名优化公司
  • 珠海华中建设工程有限公司网站/百度推广代理公司广州
  • 外贸公司做网站/免费crm系统手机版
  • 电商小程序需要什么资质/南京seo域名
  • 岳阳网站制作/网络营销的现状和发展趋势
  • 公司网站域名到期骗局/宁波最好的seo外包