需求背景
在实际开发中,下载excel、pdf的场景非常多,有时候服务端比较贴心,会将完整的url传给前端,然后前端直接window.open或者动态生成a标签直接点击,这样会直接使用浏览器提功能文件下载能力,前端不用考虑流相关的东西。而这次服务端是通过post接口,并且直接返回流文件给我,搞得我一时有点懵逼,好在还是找到了解决问题的方式,在此记录一下,加深印象。
实现方式
const handleClickDownload = async () => {
const blob = await networkService.post({
url: Api.seo.downloadLongTailKeywordRegion
});
handleDownFile('长尾词列表', blob);
};
将接受到的流处理成文件的方法
const handleDownFile = useCallback((fileName, blob) => {
const aLink = document.createElement('a');
const objURL = window.URL.createObjectURL(new Blob([blob], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })); // xlsx格式
aLink.download = fileName;
aLink.href = objURL;
aLink.click();
window.URL.revokeObjectURL(objURL);
}, []);
希望对大家能有点帮助