使用场景:服务端返回文件流格式的文件,前端需要把流文件通过Blob转换成我们想要下载的格式。比如以.xlsx,.xls结尾的格式文件。
请求接口:
/**
* @description 下载流文件的接口
* @request 通过拦截器封装的axios请求,直接使用axios也行
* @respinseType 下载流文件时必须要配置的请求头
*/
export const downloadTemplate = () => {
return request.get(
`/bottle/activity/user-wish/download-template`,
{},
{
responseType: 'blob', //必须要配置blob
},
);
};
封装utils方法:在src目录下创建utils文件夹,在文件夹中创建downloadFile文件
//引入时间格式化插件
import moment from 'moment';
/**
* @description 使用时必须于请求头加上responseType: 'blob',慎用,慎用!
* @stream 下载流(格式)
* @filename 下载文件名称
* @suffix 下载文件后缀,例如".xlsx"
* @stream: any 等参数格式是对参数类型做一下限制
*/
function downloadFile(
stream: any,
filename: string = moment(new Date()).format('YYYYMMDD'), //不传值默认以当前时间为文件名
suffix: string,
) {
//通过new Blob和文件格式生成blob对象
const blob = new Blob([stream]);
const objectURL = URL.createObjectURL(blob);
let link = document.createElement('a');
//下载的文件名
link.download = `${filename}${suffix}`;
link.href = objectURL;
// @ts-ignore 判断浏览器的方法
if (!!window.ActiveXObject || 'ActiveXObject' in window) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
link.click();
}
URL.revokeObjectURL(objectURL);
link = null;
}
export default downloadFile;
点击下载文件按钮:
//引入utils定义的downloadFile方法
import { downloadFile } from '@drift-bottle/utils';
//引入下载文件的接口
import {downloadTemplate} from '@drift-bottle/services/api/index';
//下载文件方法
<Button
onClick={() => {
downloadTemplate().then((res) => {
downloadFile(res, '文件名称', '.xlsx'); //downloadFile三个参数
});
}}
>
下载文件
</Button>