❝
在日常开发中,我们经常会遇到需要下载二进制流数据的需求,比如报表导出就是一个典型的案例!
本文的案例主要是axios,其他请求都是类似的!
❞
设置请求体
我们既然知道后端返回的是二进制流格式,所以就要对请求进行声明!如果不进行设置,会导致文件损坏,无法使用!(血的教训)
responseType
不设置也是能下载成功的,但是文件是坏的!
axios.post(url, option, { responseType: 'blob' })
处理响应文件
创建Blob
// res 是响应体
// data 是后端返回的二进制
// type 可以自行设置可以去响应体的
const { data, headers } = res
new Blob([data], { type: headers['content-type'] })
兼容处理
主要是为了兼容ie浏览器和使用了与ie浏览器相同的内核的低版本处理
// blob 就是上一步产生的blob
// filename 是下载的文件名称
if ('msSaveOrOpenBlob' in navigator) {
window.navigator.msSaveOrOpenBlob(blob, filename);
}else{
// 下载方法
}
下载方法
创建a标签
模拟点击
释放a标签
const dom = document.createElement('a')
// 创建一个新的对象URL,该对象URL可以代表某一个指定的file对象或者bold对象。
const downUrl = window.URL.createObjectURL(blob)
dom.href = downUrl
dom.download = fileName
dom.style.display = 'none'
document.body.appendChild(dom)
dom.click()
dom.parentNode.removeChild(dom)
// 释放downUrl 性能考虑
// 当前窗口关闭会自动释放
window.URL.revokeObjectURL(downUrl)
完整处理
const res = await axios.post(url,options, { responseType: 'blob' })
const { data, headers } = res
const blob = new Blob([data], { type: headers['content-type'] })
if ('msSaveOrOpenBlob' in navigator) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
const dom = document.createElement('a')
const downUrl = window.URL.createObjectURL(blob)
dom.href = downUrl
dom.download = fileName
dom.style.display = 'none'
document.body.appendChild(dom)
dom.click()
dom.parentNode.removeChild(dom)
window.URL.revokeObjectURL(downUrl)
}
原文始发于微信公众号(分享是个有趣的东西):前端如何实现二进制流文件下载
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151379.html