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

前端下载文件的方法-blob下载

前端经常会遇到下载文件的需求,后端一般提供的以下两种方法:

  • 文件地址。后端直接提供要下载的文件地址,常用于图片、音视频等静态文件
  • 文件流。后端返回文件流,常用于excel等动态文件

一、a 标签下载

1、直接html使用a标签下载
  • href:文件链接
  • download:下载时的文件名称,相当于重命名了,可以不设置该属性
<a href="https://example.com/images/a.png" download="b.png">下载</a>
2、通过js方法借用a标签下载
downloadFile(fileurl) {let a = document.createElement('a')   // 创建一个a标签a.href = fileurl                      // 赋值链接a.style.display = 'none'              // 隐藏,设置元素不可见document.body.appendChild(a)          // 添加a到页面a.click()                             // 模拟点击,进行跳转或下载操作document.body.removeChild(a)          // 操作完成,移除a
}

二、window 下载

1、window.location.href
downloadFile(fileurl) {window.location.href = fileurl
}
2、window.open
downloadFile(fileurl) {window.open(fileurl)
}

注: window.open() 可能会被浏览器拦截器屏蔽,而 window.location.href 不会受到影响

三、blob下载流文件

1、引入axios

import axios from 'axios'

2、blob下载

downloadFile() {// 文件地址,可携带参数const fileurl = `/file/example/excel/abc?id=${this.id}&appId=${this.appId}`// 请求并下载文件,可设置 headersaxios.get(fileurl, {responseType: 'blob', // 必须,指定响应的数据类型为二进制数据流(Blob对象)headers: {'X-Auto-Fp-Plate': 'example',},}).then(response => {let url = window.URL.createObjectURL(response.data) // 将二进制文件转化为可访问的urllet a = document.createElement('a')a.href = urla.style.display = 'none'document.body.appendChild(a)// 一般在响应头的 content-disposition 里设置文件名称,下面是提取文件名示例const arr = response.headers['content-disposition'].split('filename=')const fileName = decodeURI(arr[arr.length - 1])a.download = fileName  // 将获取的文件名赋值过去,也可自行赋值a.click()document.body.removeChild(a)window.URL.revokeObjectURL(url) // 释放url}).catch(error => {// do something})},
http://www.lryc.cn/news/251613.html

相关文章:

  • zookeeper+kafka+ELK+filebeat集群
  • 【LangChain实战】开源模型学习(2)-ChatGLM3
  • Python编程技巧 – 迭代器(Iterator)
  • C语言练习题
  • 常见的AI安全风险(数据投毒、后门攻击、对抗样本攻击、模型窃取攻击等)
  • flutter开发实战-为ListView去除Android滑动波纹
  • 牛客在线编程(SQL大厂面试真题)
  • ubuntu下快速搭建docker环境训练yolov5数据集
  • SpringMVC常用注解和用法总结
  • webpack如何处理css
  • IELTS学习笔记_grammar_新东方
  • 【计算机组成原理】存储器知识
  • vscode配置代码片段
  • vite脚手架,手写实现配置动态生成路由
  • 解决浏览器缓存问题
  • 【数据中台】开源项目(2)-Davinci可视应用平台
  • Java实现简单飞翔小鸟游戏
  • numpy实现神经网络
  • Bean的加载控制
  • 使用 OpenCV 识别和裁剪黑白图像上的白色矩形--含源码
  • LeetCode 每日一题 Day1
  • 【hacker送书活动第7期】Python网络爬虫入门到实战
  • 【算法】希尔排序
  • 四、Zookeeper节点类型
  • arcgis导出某个属性的栅格
  • 计算机网络——传输层
  • 策略设计模式
  • Golang中rune和Byte,字符和字符串有什么不一样
  • 实施工程师运维工程师面试题
  • 6-13连接两个字符串