当前位置: 首页 > 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文件已经可以正常打开了
在这里插入图片描述

总结

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

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

去看文档

http://www.lryc.cn/news/509636.html

相关文章:

  • PageRank Web页面分级算法 HNUST【数据分析技术】(2025)
  • 数字IC前端学习笔记:脉动阵列的设计方法学(四)
  • 对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点
  • NetApp 存储设备巡检作业指导书
  • adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);
  • 每天五分钟机器学习:核函数
  • Word窗体联动Excel实现级联组合框
  • RAG实战:构建基于本地大模型的智能问答系统
  • Docker 部署 plumelog 最新版本 实现日志采集
  • TCP/IP 邮件
  • FreeSql
  • 记一次前端Vue项目国际化解决方案
  • JS进阶-手写Promise
  • PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)
  • ioctl回顾
  • jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例
  • 如何重新设置VSCode的密钥环密码?
  • Android--java实现手机亮度控制
  • 原点安全再次入选信通院 2024 大数据“星河”案例
  • torch.nn.init 模块介绍
  • 人工智能与物联网:从智慧家居到智能城市的未来蓝图
  • 极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】
  • 纯Dart Flutter库适配HarmonyOS
  • 【R语言遥感技术】“R+遥感”的水环境综合评价方法
  • 软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)
  • Python 抽象基类 ABC :从实践到优雅
  • Elasticsearch检索方案之一:使用from+size实现分页
  • 知识图谱+大模型:打造全新智慧城市底层架构
  • Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
  • vscode安装fortran插件配置