当前位置: 首页 > article >正文

vue3项目 前端文件下载的两种工具函数

1、Blob 流下载

Blob 表示不可变的原始数据的类文件对象,通常用于处理文件或大块二进制数据。

注意:js中还有一个二进制数据类型ArrayBuffer,它们的区别如下

  • Blob 可以位于磁盘、高速缓存内存和其他不可用的位置;ArrayBuffer 是存在内存中的,可以直接操作

  • Blob 对象是不可变的;而 ArrayBuffer 是可以通过 TypedArrays 或 DataView 来操作

  • 二者可以通过方法互相转换

  • Blob包含数据和 MIME 类型(标准化文件类型标识系统,用于描述文档、文件或字节流的性质和格式)信息;ArrayBuffer 不包含任何元数据(如文件类型),更接近计算机底层的二进制表示

具体见博文:Js:Blob、ArrayBuffer、FileReader、URL、Image、关于文件下载的方法案例-CSDN博客

/*** 下载Blob流文件方法* @param data* @param filename*/
export function downloadBlobFile(data, filename) {const fileName = filename + moment(new Date()).format('YYYYMMDD')const blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'})const objectUrl = URL.createObjectURL(blob)const a = document.createElement('a')a.style.display = 'none'a.href = objectUrla.setAttribute('download', fileName)document.body.appendChild(a)a.click()a.remove()URL.revokeObjectURL(objectUrl) // 释放内存
}

适用场景:

  • 后端返回二进制流(如 axios 请求设置 responseType: 'blob'

  • 需要前端生成文件并下载

  • 需要自定义文件名和文件类型

  • 处理动态生成的内容(如导出的Excel

使用示例:

 2、根据url下载文件

/***根据url下载文件*/
export function downloadFileByURL(url: string) {let endUrl = url// 不同模块不同路径if (url.includes('/api/web/csp')) {endUrl = import.meta.env.VITE_APP_API_PATH_RESOURCE + url} else {endUrl = import.meta.env.VITE_APP_API_PATH_USER + url}const a = document.createElement('a')a.setAttribute('target', '_self')a.style.display = 'none'a.href = endUrldocument.body.appendChild(a)a.click()a.remove()
}

 适用场景:

  • 下载服务器静态文件(如图片、PDF)

  • 文件已存在于服务器指定路径

  • 不需要前端处理文件内容

使用示例:

http://www.lryc.cn/news/2394956.html

相关文章:

  • SpringAI系列 - 升级1.0.0
  • 5.31 day33
  • Vue3 + VTable 高性能表格组件完全指南,一个基于 Canvas 的高性能表格组件
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • 题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • HTML 计算网页的PPI
  • WIN11+eclipse搭建java开发环境
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍
  • MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建|文献速递-深度学习医疗AI最新文献
  • 2.5/Q2,Charls最新文章解读
  • Unity QFramework 简介
  • C++ 日志系统实战第五步:日志器的设计
  • @Docker Compose部署Alertmanager
  • 前端面试准备-3
  • 性能测试-jmeter实战1
  • 汽车高速通信的EMC挑战
  • [SC]SystemC在CPU/GPU验证中的应用(五)
  • [蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
  • 现代网络安全攻防技术与发展现状
  • 杏仁海棠花饼的学习日记第十四天CSS
  • ESP8266远程控制:实现网络通信与设备控制
  • RabbitMQ监控:关键技术、技巧与最佳实践
  • 【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)
  • zookeeper 操作总结
  • golang 实现基于redis的并行流量控制(计数锁)
  • Leetcode 2819. 购买巧克力后的最小相对损失
  • AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南
  • AnyConv OGG 转换器:轻松转换音频格式
  • C# 类和继承(使用基类的引用)
  • 进程间通信(消息队列)