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

news/2024/7/15 20:25:00 标签: react.js, pdf, 前端

React 篇

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


开发场景:

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


思路:

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

实现过程:

核心代码如下:

<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);
        }
    }

总结

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


http://www.niftyadmin.cn/n/5184351.html

相关文章

为开发GPT-5,OpenAI向微软寻求新融资

11月14日&#xff0c;金融时报消息&#xff0c;OpenAI正在向微软寻求新一轮融资&#xff0c;用于开发超级智能向AGI&#xff08;通用人工智能&#xff09;迈进&#xff0c;包括最新模型GPT-5。 最近&#xff0c;OpenAI召开了首届开发者大会&#xff0c;推出了GPT-4 Turbo、自定…

Redis Hotkey?3招定位+5招解决

作者总结分享 Redis Hotkey 定位和解决方法的优缺点。 作者&#xff1a;贲绍华&#xff0c;爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系…

【网络奇缘】- 计算机网络|网络类型|性能指标

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分类 1.根据范围分类 ​编辑 2.按使用者分​编辑 3.按交换技术分 ​编辑4.按拓扑结构分 ​…

(十一)Flask模板引擎jinja2

模板引擎Jinja2 一、简介及基本使用&#xff1a; Flask使用Jinja2作为默认的模板引擎。Jinja2是一个功能强大且易于使用的模板引擎&#xff0c;它允许我们在HTML中嵌入Python代码&#xff0c;并通过将模板和数据进行渲染来生成动态内容。 实战之在Flask中使用Jinja2模板引擎…

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

目录 引言&#xff1a; 1.所有文件展示&#xff1a; 1.中文停用词数据&#xff08;hit_stopwords.txt)来源于&#xff1a; 2.其中data数据集为chinese_text_cnn-master.zip提取出的文件。点击链接进入github&#xff0c;点击Code、Download ZIP即可下载。 2.安装依赖库&am…

Java方法中不使用的对象应该手动赋值为NULL吗?

在java方法中&#xff0c;不使用的对象是否应该手动赋值为null&#xff1f;我们先来通过一个示例看一下。 垃圾回收示例一 public class GuoGuoTest {public static void main(String[] args) {byte[] placeholder new byte[64 * 1024 * 1024];System.gc();} } 上面代码向内…

git clone:SSL: no alternative certificate subject name matches target host name

git clone 时的常见错误&#xff1a; fatal: unable to access ‘https://ip_or_domain/xx/xx.git/’: SSL: no alternative certificate subject name matches target host name ‘ip_or_domain’ 解决办法&#xff1a; disable ssl verify git config --global http.sslVe…

opencv:从0到实现人脸识别

目录 opencv 人脸检查原理&#xff1a; 整体目录&#xff1a; 1.读取并展示图片 2.人脸检测 3.视频人脸检测 4.拍照保存 5 数据训练 6 人脸识别 opencv 人脸检查原理&#xff1a; OpenCV 中的人脸检测是基于哈尔特征分类器&#xff08;Haar Feature-based Cascade Cla…