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

前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案

目录

  • 场景还原
    • 相关代码
    • 开发者工具 - 网络请求记录
  • 问题排查
    • 定位
    • 改bug
  • 总结

场景还原

我在前端使用axios接收后端xlsx表格文件流并下载,xlsx文件能够下载成功,但是打开却显示文件无法打开
xlsx文件无法打开

相关代码

请求API封装:Content–Type以及responseType经核对均没有问题

export function downloadStudent(courseId, data) {return request({url: `/curriculum/course/download/${courseId}`,method: 'POST',data,headers: {'Content-Type': "application/json"}, responseType: 'blob'})
}

接口调用:
在这里插入图片描述

下载函数封装:

/*** 下载处理器* @param name 文件名称* @param data 数据*/
export const handleDownload = (name, data) => {const fileUrl = window.URL.createObjectURL(new Blob([data]))const a = document.createElement('a')a.style.display = 'none'a.href = fileUrla.setAttribute('download', name)document.body.appendChild(a)a.click()window.URL.revokeObjectURL(a.href)document.body.removeChild(a)
}

开发者工具 - 网络请求记录

预览:二进制数据
在这里插入图片描述

问题排查

定位

可以看到文件数据已经接收到并且是二进制的,但是转为的xlsx文件却无法打开,所以我打印了一下数据想看下数据是否有问题
在这里插入图片描述
然后两眼一黑, undefined
在这里插入图片描述
这意味着我解构拿出来的data是未定义的,也就是说,在axios封装时候,响应拦截器里我经过一一系列处理,最后在code==200时会抛出resolve(response.data),我与后端约定的这个响应数据的格式是这样:

{"code": 200,"data": xxxx,"success": "success","success": true
}

那么解构出来显示data undefined,就意味着这个接收文件流的接口返回的响应数据格式很可能不是上面的格式。需要看一看response.data

改bug

既然解构拿出来没有那就不解构了,去响应拦截器里打印原始response看看
在这里插入图片描述
type是Blob没有问题,但是从response可以看到,data格式变了,response.data已经是解析后的Blob对象, 里面自然没有我们想要解构拿到的data,所以在最开始的接口API调用里不可以解构拿data,直接拿响应拦截器里resolve出的response.data用就行

在这里插入图片描述
在这里插入图片描述
现在下载的xlsx文件已经可以正常打开了
在这里插入图片描述

总结

是一次粗心大意,习惯性地直接解构拿出需要的数据,但忽略了接口文档里这个接口的响应示例说明(虽然说这个接口的响应示例说明里也啥都没写,但相比其他的接口,确实啥都没写也算是一种特别说明)

所以,更高效的解决方式就是 -->

去看文档

相关文章:

  • 竞赛选题 深度学习实现语义分割算法系统 - 机器视觉
  • Ubuntu:解决PyCharm中不能输入中文或者输入一个中文解决方法
  • 【Python语言速回顾】——数据可视化基础
  • GZ035 5G组网与运维赛题第8套
  • 如何发布自己的golang库
  • 元素的水平居中和垂直几种方案
  • 新技术前沿-2023-应用GPT提问模板写技术文章
  • 什么是Web 3.0?
  • 无声的世界,精神科用药并结合临床的一些分析及笔记(十)
  • 虹科示波器 | 汽车免拆检修 | 2010款江铃陆风X8车发动机怠速抖动、加速无力
  • S32K324 UDS Bootloader开发-下位机篇-Bootload软件(1)
  • 【Spark】What is the difference between Input and Shuffle Read
  • 07 点积
  • Technology strategy Pattern 学习笔记1-Context: Architecture and Strategy
  • Flutter Set存储自定义对象时 如何保证唯一
  • 【347天】每日项目总结系列085(2018.01.18)
  • ➹使用webpack配置多页面应用(MPA)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Date型的使用
  • JS变量作用域
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Puppeteer:浏览器控制器
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer之创建数据库快照
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • WePY 在小程序性能调优上做出的探究
  • 编写符合Python风格的对象
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 大快搜索数据爬虫技术实例安装教学篇
  • 给Prometheus造假数据的方法
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 基于web的全景—— Pannellum小试
  • 模型微调
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用Swoole加速Laravel(正式环境中)
  • 提醒我喝水chrome插件开发指南
  • 学习HTTP相关知识笔记
  • 用jquery写贪吃蛇
  • HanLP分词命名实体提取详解
  • puppet连载22:define用法
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 达梦数据库知识点
  • # 数据结构
  • ###C语言程序设计-----C语言学习(3)#
  • #Z2294. 打印树的直径
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (实战篇)如何缓存数据
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)