axios+fetch实现文档流的下载之前写过一篇关于 文档流下载的方法,当时是用的fetch,使用axios的并没有实现文档流的下载。

下面介绍axios的使用方法
axios实现文档流的下载——responseType: ‘blob’必须使用responseType: 'blob'作为config配置参数才可以对文档流进行处理。且这个参数需要放在入参的后面。
比如:
axios.post(url,params,config).then(....)
1. url:接口地址
2. params:入参
3. config:配置参数
如果是封装好的axio方法,比如我们公司封装的如下:
//导出
exportExcel(params, config) {
return request(
getUrl('/api/product/get-excel-orders20221107'),
METHOD.POST,//post还是get,根据接口来
params,
config
);
},
其他的不用注意,只需要知道一点:config和params要同级别,且需要是对象的形式才可以。

完整版代码:
exportExcel(
{//入参
...this.params,
skipCount: 0,
maxResultCount: this.formData.num,
},
{//配置
responseType: 'blob',
}
)
.then((res) => {
console.log(res);//打印的内容如下
let blobUrl = window.URL.createObjectURL(res);
let link = document.createElement('a');
link.style.display = 'none';
link.download = `订单列表.xlsx`;
link.href = blobUrl;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.handleCloseOrderDetail();
})
.catch((res) => {
this.$message.error(res.message);
})
.finally(() => {
this.submitLoading = true;
});
通过上面的接口调用,打印的res返回值如下:

针对blob对象,可以通过下面的方法来处理:
let blobUrl = window.URL.createObjectURL(res); 通过这个可以将blob对象转为链接地址
下面将链接通过a标签进行下载:
let link = document.createElement('a');
link.style.display = 'none';
link.download = `订单列表.xlsx`;
link.href = blobUrl;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
下面的代码中用到了:
1.cookie :需要安装js-cookie,然后当前页面引入 import Cookie from 'js-cookie';
2.baseUrl:接口地址一般根据开发生产环境的不同,域名链接也不同,此处需要进行判断处理
3. 如果是post请求,则需要指定头部的`content-type`类型为:application/json,入参需要是JSON.stringfy({xxx})
4. 如果是get请求,则需要指定头部的`content-type`类型为:application/x-www-form-urlencoded,入参需要是拼接到请求地址上的key value的形式
post请求的案例var baseUrl = 'xxx';
var myHeaders = new Headers();
var Authorization = Cookie.get('Authorization');
myHeaders.append('Authorization', Authorization);
myHeaders.append('content-type', 'application/json');
var requestOptions = {
method: 'post',
headers: myHeaders,
body: JSON.stringify({
...this.params,
skipCount: 0,
maxResultCount: this.formData.num,
}),
redirect: 'follow',
};
fetch(
`${baseUrl}/api/product/get-excel-orders20221107`,
requestOptions
)
.then((response) => {
return response.blob();
})
.then((res) => {
this.handleCloseOrderDetail();
const link = document.createElement('a');
let blob = new Blob([res], {
type:
".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel'",
});
link.href = URL.createObjectURL(blob);
link.download = `订单列表.xlsx`;
link.click();
this.$message.success('导出成功');
})
.catch((error) => console.log('error', error))
.finally(() => {
this.submitLoading = true;
});
get请求的案例var baseUrl = 'xxx';
var myHeaders = new Headers();
var Authorization = Cookie.get('Authorization');
myHeaders.append('Authorization', Authorization);
myHeaders.append('content-type', 'application/x-www-form-urlencoded');
var requestOptions = {
method: 'get',
headers: myHeaders,
redirect: 'follow',
};
fetch(
`${baseUrl}/api/product/get-excel-products20221107?${params}`,
requestOptions
)
.then((response) => {
return response.blob();
})
.then((res) => {
this.handleCloseOrderDetail();
const link = document.createElement('a');
let blob = new Blob([res], {
type:
".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel'",
});
link.href = URL.createObjectURL(blob);
link.download = `商品管理列表.xlsx`;
link.click();
this.$message.success('导出成功');
})
.catch((error) => console.log('error', error))
.finally(() => {
this.submitLoading = true;
});
上面代码中用到了一个将对象转为key value键值对的方法:
joinUrlParams(params, usedKey = []) {
let param = '';
for (var key in params) {
if (
params[key] !== '' &&
typeof params[key] !== 'undefined' &&
params[key] !== null
) {
if (usedKey.length > 0) {
for (var i = 0; i < usedKey.length; i++) {
if (key == usedKey[i]) {
if (param != '') {
param += '&';
}
param += key + '=' + params[key];
break;
}
}
} else {
if (param != '') {
param += '&';
}
param += key + '=' + params[key];
}
}
}
return param;
}
相比较而言,axios会更简洁,且post get不做太多的区分。
完成!!!感谢大家的支持!!!