当前位置:网站首页>拦截器,文件流,下载文件?
拦截器,文件流,下载文件?
2022-08-04 11:13:00 【是乃德也是Ned】
前言
今天下午,突然发现项目群中小伙伴在讨论文件下载的接口出问题了,摸鱼的我只好跳出来问了问(此时的我正在云顶之奕ing
),得知是浏览器的响应已经接收到了文件流,但是浏览器却没有下载该文件,只好暂停了我的摸鱼大业,开始上班。
定位问题
- 已经响应到了文件流,在浏览器跟postman都能看到,那这个接口肯定没啥问题,是跑通了的
- 去该页面的下载文件函数去打印了一下文件流 ------>
undefined
欸,问题出现了,没有找到文件流,当然下载不了
这个项目的axios请求是之前封装好了的,所以我直接去响应拦截器中,打印了一下response,这里能看到文件流的。
这不就找到问题了,是响应拦截器将文件流拦下来不让他过,需要想办法给它一个通行证。
我是不会承认之前封装的时候忘了考虑文件情况了的,绝对!不会!!!
修bug
首先去到我们统一的api管理的文件处,给axios请求加一个responseType
字段,告诉它返回的是blob
responseType:blob
接着利用这个字段,在我们的拦截器中去判断,返回的东西到底是不是文件流
service.interceptors.response.use((res) => {
const { config, headers } = res
// 判断是否是文件流
if(config.responseType == 'blob'){}
}
接下来,在大括号里面,直接return res.data
就可以了。
但是我已经出手了,能这样就收手么?不能!咱要做到完美~
这是后端传来用来放文件名的头,我要将文件名和后缀从中取出,为了后面下载的时候使用。
正好前几天学了切割url参数,这个地方刚好用到
const file = headers['content-disposition'].split(';')[1].split('=')[1]
const fileGroup = file.split('.')
const fileName = fileGroup[0]
const fileEnd = fileGroup[1]
return {blob:res.data, fileName, fileEnd}
切下来之后,直接return回页面里,在页面中使用就好。
看一下切割好的样子吧:
下载函数
有了文件流,文件名字,后缀,只需要一个下载函数,我们就可以任意的下载后端传过来的文件了,这里我的想法是a
标签。
readBlobDown(result, filename){
let blob = result
let reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = function(e) {
// 转换完成,创建一个a标签用于下载
let a = document.createElement('a')
a.download = filename // 设置下载的文件名称
a.href = e.target.result
// 触发click 达成下载事件触发
a.click()
}
}
去项目的utils下创建这么一个工具函数,传入参数是文件流和文件名字,这样传进来什么,都可以直接下载,简直完美!
模板字符串当然要用起来~
使用方法:
readBlobDown(blob,`${fileName}.${fileEnd}`)
写在最后
好了好了,搞定了,我要继续我的摸鱼大业了~
我是Ned
,一个前端学习者,希望可以同大家一起学习进步,一起加油~
你可以在掘金找到我:Ned
也可以前往我的个人博客:blog.wangez.site
可以来交换友链哟~
边栏推荐
猜你喜欢
What is the principle of thermal imaging temperature measurement?Do you know?
Apache Calcite 框架原理入门和生产应用
The use of DDR3 (Naive) in Xilinx VIVADO (3) simulation test
*iframe*
C language * Xiaobai's adventure
8月活动|51CTO十七周年庆,发博文得茶具/笔记本/T恤等礼品!
第二批养老理财试点产品发行 一小时销售20亿元
Jenkins使用手册(1) —— 软件安装
zabbix deployment
上帝空间——全球首个基于Web3.0的艺术协议创意平台,拓宽多元艺术融合边界
随机推荐
Jenkins使用手册(1) —— 软件安装
学会使用set和map的基本接口
Doing Homework HDU - 1074
【LeetCode】701.二叉搜索树中的插入操作
使用.NET简单实现一个Redis的高性能克隆版(二)
cubemx stm32 afm3000模块 气体流量传感器 驱动代码
Super Learning Method
【LeetCode】653. 两数之和 IV - 输入 BST
linux下数据库初始化密码
数字知识库及考学一体化平台
图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)
【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行
技术干货 | 用零信任保护代码安全
DB2查看执行过长的SQL
ORA-00054 资源正忙
利用pytest hook函数实现自动化测试结果推送企业微信
自己实现一个枚举validation校验器
ORB-SLAM3中的优化
使用.NET简单实现一个Redis的高性能克隆版(二)
MySQL不提供数组,只能做成表吗?