React + hooks + Ts 实现将后端响应的文件流(如Pdf)输出到浏览器下载

React 篇

一些关于react 学习与总结

这篇是记录开发中关于实现将后端响应的文件流(如Pdf)输出到浏览器下载,基于React + Hooks + Ts。


开发场景:

实现将后端响应的文件流(如Pdf)输出到浏览器下载,


思路:

使用axios库来发送请求并接收后端响应的pdf文件,然后使用Blob对象将响应数据转换为二进制数据,最后使用URL.createObjectURL()方法将二进制数据转换为URL,然后将URL赋值给a标签的href属性,再使用a标签的click()方法触发下载。

实现过程:

核心代码如下:

javascript 复制代码
<Col span={22} >
       <Button type="primary" size={"large"} onClick={handleDownload} disabled={loading}>
        {loading ? '下载中...' : '下载文件'}
        {/*{pdfUrl && <iframe src={pdfUrl} width="100%" height="500px" />}*/}
        </Button>
</Col>

具体实现方法如下

javascript 复制代码
   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);
        }
    }

总结

使用useState钩子来保存PDF文件的URL。当用户点击下载按钮时,我们使用axios发送GET请求,并将响应类型设置为blob。然后,我们使用Blob对象将响应数据转换为二进制数据,并使用URL.createObjectURL()方法将其转换为URL。最后,我们将URL保存到state中,并使用a标签的click()方法触发下载

相关推荐
美狐美颜sdk4 小时前
从人脸关键点到动态贴图:面具特效在美颜SDK中的实现原理
前端·图像处理·人工智能·直播美颜sdk·美颜api
我命由我123455 小时前
React Router 6 - 编程式路由导航、useInRouterContext、useNavigationType
前端·javascript·react.js·前端框架·html·ecmascript·js
威联通网络存储5 小时前
告别掉帧与素材损毁:威联通 QuTS hero 如何重塑影视后期协同工作流
前端·网络·人工智能·python
anOnion5 小时前
构建无障碍组件之Tabs Pattern
前端·html·交互设计
一招定胜负6 小时前
课堂教学质量综合评分系统
java·linux·前端
2301_780669866 小时前
前端logo替换开发
前端·vue.js
启山智软6 小时前
【启山智软智能商城系统技术架构剖析】
java·前端·架构
我命由我123457 小时前
React Router 6 - 嵌套路由、路由传递参数
前端·javascript·react.js·前端框架·html·ecmascript·js
十六年开源服务商7 小时前
2026年WordPress网站地图完整指南
java·前端·javascript
GISer_Jing8 小时前
Agent架构师详解:Skill是什么?附CSDN博客撰写可复用Skill示例
前端·ai·aigc