vue 下载文件 处理后台返回的文件流

1. 下载文件很常见,下载成各种格式的也很常见,本质就是后台返回一个文件流,我们前端去处理一下就行,但是如果因为某些条件,没有返回文件流,返回告诉你,文件出现错误了,那我们就需要把这个错误打出来,给个提示框告诉用户,不能让用户发现文件都下下来了,里面确是文件出现错误,这样就很不友好,怎么做呢,如下代码。

2. 其实很简单我们只需要处理一下这个文件流就行,因为下载文件吗, 我们本身用 blob 类型去接受了,所以正常情况下呢 我们控制台是看不到错误代码 和错误信息的,这个时候我们只能想办法去给他解析一下,解析成json 是不是就能看了,怎么做呢,使用 new FileReader() 。

3. 具体解释一下:

  1. const reader = new FileReader();: 创建一个新的FileReader对象,用于读取文件或数据。

  2. reader.onload = () => { ... }: 当读取操作完成时,会触发onload事件,这里使用箭头函数来定义事件处理程序。在这个事件处理程序中,你可以处理读取到的数据。

  3. try { ... } catch (error) { ... }: 这是一个try-catch语句块,用于捕获可能出现的错误。在try块中,你可以编写处理数据的逻辑;如果出现错误,会被catch块捕获并进行处理。

  4. reader.readAsText(res.data);: 这一行代码是将res.data中的数据作为文本进行读取。readAsText()是FileReader对象的方法,用于以文本形式读取文件或数据

 axios.get('http://localhost:8900/........,   //你的地址
                      {
                        headers: {
                            Authorization: this.token  
                        },
                        responseType:'blob', 
                        params:{
                            templateId: 2,
                            date:  '202401' 
                        }
                     }
                    ).then(res=>{
                        console.log('下载模板',res)
                        const reader = new FileReader(); //使用FileReader对象读取Blob数据,并在读取完成后将其解析为JSON格式
                        reader.onload = () => {
                        try {
                                const jsonData = JSON.parse(reader.result);
                                console.log('下载后解析成json',jsonData)
                                if (jsonData.code==500) {
                                    console.log('解析出错:', jsonData.msg);
                                    this.$message.error(jsonData.msg)
                                } else {
                                }
                            } catch (error) {
                                  console.log('JSON数据解析成功,开始下载文件流');
                                // 在这里执行下载文件流的操作,例如创建下载链接并点击下载
                                let blob = new Blob([res.data])
                                let url = window.URL.createObjectURL(
                                new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})  
                                ); //创建下载链接 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
                                let link = document.createElement("a"); //创建a标签
                                link.style.display = "none"; //将a标签隐藏
                                link.href = url; //给a标签添加下载链接
                                link.setAttribute("download", '健康度评价模板'); // 此处注意,要给a标签添加一个download属性,属性值就是文件名称 否则下载出来的文件是没有属性的,空白白
                                document.body.appendChild(link);
                                link.click(); //执行a标签
                            }
                        };
                        reader.readAsText(res.data);  

                    }).catch(err=>{
                        console.log(err)
                    })
                },

4. 以上只是下载成Excel 格式了,其它格式的话改掉后缀 (type)就行。

常见的格式:

5. 如果对你有帮助的话,还请点一下赞哦 ^_^!

### 在 Vue处理并打印后端返回文件流 为了实现在 Vue 项目中打印后台返回文件流功能,可以采用以下方法: #### 创建 HTTP 请求获取文件流 使用 `axios` 或其他 HTTP 客户端库发送请求来接收来自服务器的 PDF 文件流。确保设置响应类型为 `blob`。 ```javascript import axios from 'axios'; async function fetchPdfStream() { try { const response = await axios.get('/api/pdf', { responseType: 'blob' }); return new Blob([response.data], { type: 'application/pdf' }); } catch (error) { console.error('Error fetching the pdf:', error); } } ``` #### 使用 iframe 进行打印操作 创建一个隐藏的 `<iframe>` 元素用于加载接收到的数据 URL 形式的 PDF 文档,并触发其内置的打印对话框。 ```html <template> <!-- Other components --> </template> <script setup lang="ts"> // ... previous code ... function printPdf(blob: Blob) { // Create a temporary object URL pointing to our blob. let url = window.URL.createObjectURL(blob); // Insert an invisible iFrame into body and set its source as created ObjectUrl. var iframe = document.createElement('iframe'); iframe.style.display = "none"; iframe.src = url; document.body.appendChild(iframe); // Wait until iFrame is loaded before printing it out. iframe.onload = () => { setTimeout(() => { iframe.contentWindow?.print(); // Clean up after ourselves by removing both elements when done. window.URL.revokeObjectURL(url); // Release memory associated with this URL. document.body.removeChild(iframe); }, 0); }; } // Call these functions appropriately within your component lifecycle or event handlers. </script> ``` 此方案能够有效地将从后端获得的PDF文件流转换成可打印的形式,在浏览器环境中执行打印命令[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值