fetch请求文件流并下载(Excel)

本文介绍了如何使用Fetch API从远程服务器获取Excel文件,并通过Blob和ArrayBuffer两种方式将文件流转换为可下载的.xlsx文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、blob文件流

fetch(url,{
    method: 'get',
    responseType: 'blob'
}).then(res => {     
    return res.blob();
}).then(blob => {
    let bl = new Blob([blob], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
    let fileName = '文件名'+".xlsx";
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    window.URL.revokeObjectURL(link.href);
})

2、arraybuffer文件流

把上面的blob改成arraybuffer就好了

fetch(url,{
    method: 'get',
    responseType: 'arraybuffer'
}).then(res => {     
    return res. arraybuffer();
}).then(arraybuffer => {
    let bl = new Blob([arraybuffer], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
    let fileName = '文件名'+".xlsx";
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    window.URL.revokeObjectURL(link.href);
})
### 前端实现下载Excel文件动态修改文件名 在前端开发中,为了提升用户体验以及满足实际需求,可以通过多种方式实现在下载 Excel 文件的同时动态修改文件名的功能。以下是具体方法及其背后的实现原理。 #### 方法一:基于 `Blob` 和 `<a>` 标签的方式 此方法利用 JavaScript 的 `Blob` 对象来创建文件对象,通过 HTML 中的 `<a>` 标签完成文件下载操作。这种方法能够灵活控制文件名称和类型。 ```javascript function downloadFile(blob, fileName) { const link = document.createElement('a'); link.href = URL.createObjectURL(blob); // 创建一个指向 BlobURL link.download = fileName; // 设置下载后的文件名 document.body.appendChild(link); link.click(); // 自动触发点击事件以启动下载 document.body.removeChild(link); // 移除临时创建的 a 标签 } // 调用示例 fetch('/api/export-excel') // 请求获取 Excel 数据流 .then(response => response.blob()) // 将响应转换为 Blob 类型 .then(blob => { downloadFile(blob, 'customFileName.xlsx'); // 动态指定文件名为 customFileName.xlsx }) .catch(error => console.error('Error:', error)); ``` 上述代码实现了从服务器请求 Excel 数据流后将其保存为具有自定义名称的文件[^1]。 --- #### 方法二:使用 Vue.js 结合 Axios 处理文件流 当项目采用 Vue.js 开发框架时,可以借助 Axios 库发起 HTTP 请求与服务端交互,从而更方便地管理异步逻辑。 ```javascript import axios from 'axios'; export function exportExcel() { axios({ method: 'post', // 或者 get,取决于 API 设计 url: '/api/export-excel', responseType: 'blob' // 关键配置项,用于接收二进制数据流 }).then((response) => { const blob = new Blob([response.data], { type: 'application/vnd.ms-excel;charset=utf-8' }); const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = 'dynamicFileName.xlsx'; // 可在此处动态生成文件名 document.body.appendChild(link); link.click(); document.body.removeChild(link); }).catch((error) => { console.error('Failed to fetch and save the file.', error); }); } ``` 该方案适用于需要向后端传递参数的情况(如 POST 请求),通过设置 `responseType` 参数确保接收到的是原始二进制数据而非字符串编码形式的数据[^5]。 --- #### 方法三:直接调用窗口打开链接 (仅限简单场景) 如果目标资源已经存在于某个固定的网络地址上,则可以直接通过调整 `window.location.href` 或者 `window.open()` 函数跳转至对应路径进行下载。然而需要注意跨域限制可能会影响最终效果。 ```javascript const filename = encodeURIComponent('exampleFilename.xlsx'); // 编码防止特殊字符干扰 const url = `/path/to/your/excel?filename=${filename}`; window.open(url, '_blank'); // 新标签页加载下载页面 ``` 尽管这种做法较为简便快捷,但在某些复杂环境下可能会遇到兼容性问题或者安全性隐患[^2]。 --- ### 总结说明 以上三种技术手段各有优劣,在不同应用场景下可以选择最适合的一种实施策略: - 如果追求灵活性且需支持复杂的业务逻辑,请优先考虑 **方法一** 或 **方法二**; - 若只是单纯提供静态资源访问入口则推荐尝试 **方法三**;不过要注意潜在风险因素的影响范围。 无论选用哪种途径都务必记得妥善处理异常状况以免影响整体程序稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值