vue中将从后端获取的blob流数据转为文件
文章目录1 post方法请求后端blob数据2 前端将Blob流文件转为文件导出2.1 函数方式2.2 使用file-saver插件1 post方法请求后端blob数据let expUrl = encodeURI(urls.getList)let params = {type: 0,keyword: this.search.keyword ? this.search.keyword : '',}t
·
1 post方法请求后端blob数据
let expUrl = encodeURI(urls.getList)
let params = {
type: 0,
keyword: this.search.keyword ? this.search.keyword : '',
}
this.$http
.post(expUrl, params, {
headers: { 'Content-Type': 'application/json' },
responseType: 'blob',
withCredentials: true,
})
.then(res => {
if (res) {
saveAs(res, '导出文件名称.xlsx') // 插件方式
// this.readBlobDown(res, '导出文件名称.xlsx') // 使用函数
}
})
.catch(err => {
this.$tips.tipWarning('导出异常,请稍后重试')
return Promise.reject(err)
})
注意post请求时,配置文件中含有参数responseType: ‘blob’,添加此配置,则会将请求成功后的数据,封装成Blob类型,便于响应拦截器中获取此类型的数据并做一些特殊处理,如下(相当于是加了一个标签;据测试,只要请求的接口中,添加了responseType: ‘blob’,则返回的类型都会被封装成Blob类型,这个类型相当于是前端添加的一个标签,是为了方便后续处理;前端通过和后端约定,使用Blob这种类型请求,此时后端返回文件流,实现某种结果):
{
headers: { 'Content-Type': 'application/json' },
responseType: 'blob',
withCredentials: true,
}
且此时响应拦截器中要添加拦截:
if (response.data instanceof Blob) {
return response.data
}
若post请求的then里面得到的blob流为空,注意排查是否是中间进行了数据处理
请求得到的blob流正常如下所示(我们真正转换为文件时需要使用到的是返回的类型为Blob的data):
2 前端将Blob流文件转为文件导出
有两种方式
2.1 函数方式
/**
* 读取下载的文件流
*/
readBlobDown(result, filename) {
var blob = result // ie 使用
if (window.navigator.msSaveBlob) {
// for ie 10 and later
try {
var blobObject = new Blob([blob], { type: 'application/vnd.ms-excel' }) // 构造一个blob对象来处理数据
window.navigator.msSaveBlob(blobObject, filename)
} catch (e) {
console.log(e)
}
} else {
// 其他浏览器 下载方式
var reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = function(e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement('a')
a.download = filename // 设置下载的文件名称
a.href = e.target.result
// 兼容触发click
var evt = document.createEvent('MouseEvents')
evt.initEvent('click', true, true)
a.dispatchEvent(evt)
}
}
},
使用:
this.readBlobDown(resBlob, '导出文件名称.xlsx') // 使用函数
2.2 使用file-saver插件
前期准备:
1.安装插件:npm install --save file-saver
2.在需要导出的文件下引入:import { saveAs } from 'file-saver'
使用:
直接 saveAs(res, '导出文件名称.xlsx')
this.$http.
.post(expUrl, params, {
headers: { 'Content-Type': 'application/json' },
responseType: 'blob',
withCredentials: true,
})
.then(res => {
if (res) {
saveAs(res, '导出文件名称.xlsx') // 插件方式
// this.readBlobDown(res, '导出文件名称.xlsx') // 使用函数
}
})
更多推荐
已为社区贡献3条内容
所有评论(0)