第一步:后端返回base64的字端和值,并转一下
api.post(
{
fileName: target.linkName,
fileUrls: allTypeCodeFile,
},
{
apiRoot: `${ENV.AUTH_API_ROOT}/FILE`,
apiPath: '/admin/download/zip',
}
).then((res: any) => {
this.downloadFile(
`${target.linkName}.zip`,
'data:application/zip;base64,' + res.base64
);
});
第二步:将base64转位blob方能下载
base64ToBlob = (code: string) => {
let parts = code.split(';base64,');
let contentType = parts[0].split(':')[1];
let raw = window.atob(parts[1]);
let rawLength = raw.length;
let uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], { type: contentType });
};
第三步:写下载步骤
downloadFile = (fileName: string, content: string) => {
let aLink = document.createElement('a');
let blob = this.base64ToBlob(content);
let evt = document.createEvent('HTMLEvents');
//initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为
evt.initEvent('click', true, true);
aLink.download = fileName;
aLink.href = URL.createObjectURL(blob);
aLink.click();
};