ToB企服应用市场:ToB评测及商务社交产业平台
标题:
vue项目:axios 请求类型为blob类型的接口sucess封装 & err封装
[打印本页]
作者:
商道如狼道
时间:
2024-8-1 19:54
标题:
vue项目:axios 请求类型为blob类型的接口sucess封装 & err封装
简介
在现代Web应用中,我们通常会碰到一种交互是文件的上传与下载,而更常用的技术是将文件转唯二进制流来进行处理。此时就必要处理为Blob类型的数据,本文将详细介绍如安在Vue项目中利用Axios处理Blob类型的请求,并进行成功与错误的封装处理
什么是blob类型
在计算机科学和数据库领域,Blob(Binary Large Object)是一个可以存储二进制文件的容器,常用于数据库中以存储大容量的二进制数据,如图片、音频文件等。。由于图片、音频的尺寸较大,必要利用特殊的方式来处理,如上传、下载或存储到数据库中。
为什么必要Blob类型?
在某些情况下,我们必要从服务器下载文件,例如导出Excel表格、下载PDF文档等。此时,服务器通常会返回二进制数据,而不是常规的JSON数据。为了精确处理这些二进制数据,我们必要将请求的响应类型设置为Blob。
利用Axios处理Blob类型的请求
import axios from 'axios';
const downloadFile = async (url, params) => {
try {
const response = await axios({
method: 'get',
url: url,
params: params,
responseType: 'blob', // 设置响应类型为blob
});
// 创建一个Blob对象
const blob = new Blob([response.data], { type: response.headers['content-type'] });
const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = downloadUrl;
link.setAttribute('download', 'filename.ext'); // 设置下载文件名
document.body.appendChild(link);
link.click();
link.remove();
} catch (error) {
handleError(error);
}
};
const handleError = (error) => {
// 错误处理逻辑
};
export default downloadFile;
复制代码
封装成功与错误处理逻辑
重要是用逻辑是在vue项目中对于响应类型为blob类型的下载,以及后端正常抛错但被blob转义为blob怎样成功的抛错。在项目中为规范写法,重要会涉及到如下文件的修改和处理:
axios.js===>此文件重要用于请求响应拦截的处理
import axios from 'axios'
// HTTPresponse拦截
axios.interceptors.response.use(
async (bigData) => {
const { status, statusText, data } = bigData
if (status === 200) {
if (bigData.headers['content-type'].indexOf('application/json') === -1 ) {
// 针对下载接口做特殊处理,根据content-type 字段来
return Promise.resolve(data)
}
if (data.code === 1000) {
return Promise.resolve(data.data)
} else {
return Promise.reject(data)
}
}
} else {
}
},
(error) => {
},
)
复制代码
request.js =====>编写接口信息
import request from '@/axios'//axios.js所在的目录
export const export = (data) =>
request({
url: url,
method: 'post',
data,
responseType: 'blob',
})
复制代码
详细页面的导出接口
import { export } from '@request.js'
exportExcel() {
export(params)
.then((res) => {
const blob = new Blob([res], {
type: 'application/vnd.ms-excel',
/*你需要处理的数据类型的数据
doc: 'application/msword',
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
xls: 'application/vnd.ms-excel',
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
mp4: 'application/octet-stream',
m4a: 'application/octet-stream',
*/
})
const fileName = ''
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象
document.body.removeChild(elink)
})
.catch((err) => {
/*后端返回的错误信息
{
"code": 1006,
"data": null,
"message": "当前所选案件无文书信息"
}
但由于请求类型为blob类型时,后端的返回信息会被转义为blob二进制流,因此需要进行如下处理
*/
if (err.type === 'application/json') {
const fileReader = new FileReader()
fileReader.readAsText(err, 'utf-8')
fileReader.onload = function () {
const result = fileReader.result
const msg = result ? JSON.parse(result).message : ''
that.$message.error(msg)
}
return
}
})
},
复制代码
结论
以上就是一个简单的对于blob类型的二进制流进行的处理。固然还可以在此方法的底子上进行更深层次的封装,比如利用混入进行封装引入处理,假如各人另有其他的关于二进制流的下载及报错处理 可以评论区继承交流呀!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4