前端下载文件,文件打不开的问题记录

需求:

下载是很常见的接口,但是经常存在下载的文件异常的问题。此处记录一个常见的错误。

分析:

1、接口请求需要配置{responseType: 'blob'},此时要求返回的格式为blob,进而进行下载。

javascript 复制代码
const res = await axios.post(apis.exportAlertInfos, params, { responseType: 'blob' })

2、若后端报错。此时后端返回的response的类型res.data.type是application/json,但是前端接收的数据res.data还是blob格式,(打开浏览器的接口控网络显示的其实是json的格式)。此时需要通过res.data?.text()对数据进行解析将blob文件流转为json格式。

javascript 复制代码
 if (res?.data?.type == 'application/json') {
     const err = await res.data?.text()
     const errObj = JSON.parse(err)
     loading.close()
     ElMessage.error(errObj?.message || '文件下载异常')
     return 
 }

3、 若后端返回的文件流正常,此时需要根据response的请求头的content-type进行数据处理。

javascript 复制代码
const fileName = res.headers['content-disposition'].split('=')[1]
const blob = new Blob([res.data], {
  type: res.headers['content-type']
})
// const blob = new Blob([res.data], {
//   type: "application/msexcel;charset=utf-8"
// })
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.setAttribute('download', decodeURI(fileName))
document.body.appendChild(link)
link.click()
window.URL.revokeObjectURL(url)
document.body.removeChild(link)
相关推荐
又是努力搬砖的一年1 分钟前
整合swagger,以及Knife4j优化界面
java·前端
山有木兮木有枝_12 分钟前
JavaScript预编译机制深度解析:从V8引擎到执行上下文
前端
袁煦丞15 分钟前
电子书阅读器界的"万能工具"Koodo Reader :cpolar内网穿透实验室第593个成功挑战
前端·后端·远程工作
程序猿小D36 分钟前
第14节 Node.js 全局对象
linux·前端·npm·node.js·编辑器·vim
Mintopia41 分钟前
当代码遇见光影魔术师:用 JavaScript 揭秘环境光遮蔽的奇幻世界
前端·javascript·计算机图形学
Dignity_呱1 小时前
别在傻傻分不清any void never unknown的场景啦
前端·vue.js·typescript
站在风口的猪11081 小时前
《前端面试题:CSS3新特性》
前端·css·html·css3·html5
crary,记忆1 小时前
Angular报错:cann‘t bind to ngClass since it is‘t a known property of div
前端·javascript·angular·angular.js
betterangela1 小时前
react私有样式处理
前端·react.js·前端框架
几何心凉1 小时前
如何处理React中表单的双向数据绑定?
前端·javascript·react.js