终于,解决了带token的下载请求...

2,188 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

事情的起因是最近在项目中遇到了一个导出的请求,我刚接需求的时候心想这高兴啊,有五分钟就能搞定,加一个到处按钮,然后写两行代码,搞定了再学习知识(愉快摸🐟)。

说干就干我直接框框两下写完样式准备写业务代码,一看后端同学说的话傻眼了,

截屏2021-10-21 上午11.02.22.png

之前下载都是get请求,直接挂上链接就可以直接下载的,写个简单例子感受一下

截屏2021-10-21 上午11.07.09.png

    const node = document.querySelector('#export').onclick = function () {
      window.open('后端下载的接口连接')
    }

这样就可以直接下载,相信有很多同学也是这么实现的,但本次业务较复杂,索性我就沉下心来想解决办法,一开始我先试着调用接口看返回的是什么,结果不出意外,流文件,这也不行啊,这玩意我不能用啊,我只能再想办法,网上的资源很多,但是有一条让我眼前一亮,转换成Blob对象然后就可以通过这个对象生成url挂在一个a标签的src上面,调用完再删除这个标签.

方法也有了思路也清晰了,下一步就是找资料看一下都是干什么的,直接上代码


      const result = await axios.post('/ss/ss') //访问接口
      if(result) {
        const downUrl = new Blob([result]) 
        const url = window.URL.createObjectURL(downUrl)
        const aNode = document.createElement('a')
        aNode.href = url
        aNode.setAttribute('down','下载内容')
        aNode.click()
        aNode.parentNode.removeChild(aNode)
        window.URL.revokeObjectURL(url)
      }

注意点:创建完了下载的url这个连接并不会回收,所以我们要手动回收, 方法就是URL.revokeObjectURL(url)

这样写完还是不可以使用,报错,打个debugger看了一下Blob里面并不是一个blob对象。我们想使用这种方式还得使用函数形式的axios请求,


axios({
method:'post',
data,
url:'/ss/ss',
responseType: 'blob' //这一句必须加上
})

这样才能形成完整的一套通过post请求下载文件,因为没有规定返回值是blob对象 ,

代码写完了,看到文件正常可以下载了还是很开心的,这次你学废了吗?

其他的像blob对象,url的api相关的知识还是需要各位小伙伴单独去学习,有什么问题或疑问欢迎大家在评论留言我也会跟大家一起讨论的,文章哪里写的有错误点,望包涵,望指出,😄😄