React 篇
一些关于react 学习与总结
这篇是记录开发中关于实现将后端响应的文件流(如Pdf)输出到浏览器下载,基于React + Hooks + Ts。
开发场景:
思路:
实现过程:
<Col span={22} >
<Button type="primary" size={"large"} onClick={handleDownload} disabled={loading}>
{loading ? '下载中...' : '下载文件'}
{/*{pdfUrl && <iframe src={pdfUrl} width="100%" height="500px" />}*/}
</Button>
</Col>
const [loading, setLoading] = useState<boolean>(false); //钩子函数
const [pdfUrl, setPdfUrl] = useState('');
const handleDownload = async() =>{
setLoading(true);
try {
const response = await axios.get("http://47.98.103:8887/oms/pdf/export_pdf_test", {
responseType: 'blob', // 告诉axios响应类型为二进制数据
params:{
id:companyId //参数:传给后端的是 id 已经获取到了
}
});
const blob = new Blob([response.data], { type: 'application/pdf' }); // 将响应数据转换为二进制数据
const url = URL.createObjectURL(blob); // 将二进制数据转换为URL
setPdfUrl(url); // 将URL保存到state中
const link = document.createElement('a');
link.href = url;
link.download = '企业工商年报.pdf';
link.click(); // 触发下载
// const fileName = response.headers['content-disposition'].split('=')[1]; // 从响应头中获取文件名
// saveAs(response.data, fileName); // 使用FileSaver.js保存文件
} catch (error) {
message.error("服务器繁忙,请稍后重试")
console.error(error);
} finally {
setLoading(false);
}
}