0


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

目录

场景还原

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

相关代码

请求API封装:

Content–Type以及responseType经核对均没有问题

exportfunctiondownloadStudent(courseId, data){returnrequest({url:`/curriculum/course/download/${courseId}`,method:'POST',
    data,headers:{'Content-Type':"application/json"},responseType:'blob'})}
接口调用:

在这里插入图片描述

下载函数封装:
/**
 * 下载处理器
 * @param name 文件名称
 * @param data 数据
 */exportconsthandleDownload=(name, data)=>{const fileUrl = window.URL.createObjectURL(newBlob([data]))const a = document.createElement('a')
  a.style.display ='none'
  a.href = fileUrl
  a.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文件已经可以正常打开了
在这里插入图片描述

总结

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

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

去看文档

标签: 前端

本文转载自: https://blog.csdn.net/liushi21/article/details/134216566
版权归原作者 六时二一 所有, 如有侵权,请联系我们删除。

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

还没有评论