文件下载的几种方式
1、使用window.open方法
url: 可以为文件存放的地址
function downloadFile(url) {window.open(url);
}
2、使用<a>标签进行文件下载
<a href="/多因素登录说明文档.pdf" class="link-text">说明文档</a>
3、使用fetch和Blob对象
这种方法适用于需要处理响应数据为Blob的情况,比如从API获取文件流。
async function downloadFile(url, name) {const response = await fetch(url);const blob = await response.blob();const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.setAttribute('download', name);link.click();URL.revokeObjectURL(link.href);
}
4、使用Axios和Blob对象
如果你的项目中使用了Axios进行HTTP请求,可以结合Blob对象来实现文件下载。
import axios from 'axios';function downloadFile(url, filename) {axios({url: url,method: 'GET',responseType: 'blob', // 重要}).then((response) => {const blob = new Blob([response.data], { type: 'application/octet-stream' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.setAttribute('download', filename);link.click();URL.revokeObjectURL(link.href);});
}
5、vue中,实现文件下载,且能看到进度条
<template><div><button @click="startDownload">Download</button><div v-if="downloadProgress > 0"><p>Download Progress: {{ downloadProgress }}%</p><progress :value="downloadProgress" max="100"></progress><button @click="cancelDownload">Cancel Download</button></div><div v-if="error"><p>Error: {{ error }}</p></div></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';const downloadProgress = ref(0);
const error = ref(null);
const cancelTokenSource = axios.CancelToken.source();const startDownload = () => {error.value = null; // 重置错误信息downloadProgress.value = 0; // 重置下载进度axios({method: 'get',url: 'your-file-url', // 接口urlresponseType: 'blob',cancelToken: cancelTokenSource.token,onDownloadProgress: (progressEvent) => {if (progressEvent.lengthComputable) {downloadProgress.value = Math.round((progressEvent.loaded * 100) / progressEvent.total);}},}).then((response) => {// 创建一个URL对象并下载文件const url = window.URL.createObjectURL(new Blob([response.data]));const link = document.createElement('a');link.href = url;link.setAttribute('download', 'filename.ext'); // 设置下载文件名document.body.appendChild(link);link.click();link.remove();}).catch((error) => {if (axios.isCancel(error)) {console.log('Request canceled', error.message);} else {error.value = error.message; // 设置错误信息}});
};const cancelDownload = () => {cancelTokenSource.cancel('Download canceled by the user.');downloadProgress.value = 0; // 重置下载进度
};
</script><style>
progress[value] {width: 100%;height: 20px;
}
</style>
上述几种下载方式的优劣势:
1、window.open :
优势:
- 简单易用:只需要一行代码即可实现。
- 无需额外的DOM操作:不需要创建额外的DOM元素。
劣势:
- 控制有限:无法控制下载进度,也无法提供下载进度反馈。
- 安全性问题:可能会受到浏览器安全策略的限制,某些情况下可能被浏览器拦截
2、a 标签
优势:
- 兼容性好:大多数现代浏览器都支持。
- 无需额外的网络请求:直接通过URL下载,不需要通过JavaScript获取文件内容。
- 简单实现:代码简单,易于实现。
劣势:
- 控制有限:同样无法控制下载进度,也无法提供下载进度反馈。
- 用户体验:在某些情况下,用户体验不如其他方法,因为用户可能会被重定向到新页面
- url 指下载文件的存放地址,服务器可以访问的静态资源的地址,可以放在前端本地的public 目录下
3、使用fetch和Blob对象
优势:
- 现代API:fetch是现代的网络请求API,支持Promise,易于集成到异步流程中。
- 进度控制:可以通过监听fetch请求的progress事件来实现下载进度的监控。
- 流式处理:对于大文件,fetch可以更好地处理流式数据。
劣势:
- 浏览器兼容性:虽然现代浏览器普遍支持fetch,但在一些旧浏览器中可能需要polyfill。
- 复杂度:对于简单的下载需求,使用fetch可能显得有些过度。
4、使用Axios和Blob对象
优势:
- 集成度高:如果你的项目中已经使用了Axios,那么使用Axios进行文件下载可以保持代码的一致性。
- 配置灵活:Axios提供了丰富的配置选项,可以轻松地处理不同的下载需求。
- 错误处理:Axios的错误处理机制可以简化下载失败时的处理流程。
劣势:
- 依赖外部库:需要依赖Axios库,增加了项目的依赖。
- 性能:相比于原生的fetch,使用Axios可能会有轻微的性能开销。
5、vue中的文件下载
优势:
- 进度反馈:可以提供详细的下载进度反馈,提升用户体验。
- 取消下载:支持取消下载操作,给用户提供更多的控制权。
劣势:
- 代码复杂度:实现进度条和取消下载功能需要更多的代码和逻辑。
相关文章:
文件下载的几种方式
1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...
车联网安全学习之TBOX
Telematics BOX,简称 T-BOX,也称远程信息处理控制单元(Telematics Control Unit, TCU),集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...
访问http网页强制跳转到了https的解决办法
目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因:HSTS(HTTP Strict Transport Security)什么是 HSTS?HSTS 的工作原理 如何解决?1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息:在 Firef…...
3D 生成重建016-SA3D从nerf中分割一切
3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标: SAM 是一种强大的二维视觉基础模型,能够在 2D 图像中进行任意物体的分割。传统上,SAM 在二维空间表现出色,但其无…...
阿里云整理(二)
阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程: 用户在浏览器输入域名URL,例如www.baidu.com。 不过,浏览器并不知道为该域名提供服务的服务器具…...
qt基本部分控件用法(一)
前言: 以前 windows下做工具主要是MFC,趁有点空时间,研究了QT,感觉跟MFC 差不多,VS 比 QT CREATOR 还是强大,不过QT可以跨平台,功能更强大,MFC 只能在win平台下.; 1:环境…...
【Linux】环境ChatGLM-4-9B 模型之 openai API 服务
一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…...
Too many open files 问题处理
某个简单的 python 服务,运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题,首先要理解什么是文件描述符,可以参考我的另一篇文章(Linux 系统文件描述符(File Descriptor&a…...
CentOS 7 环境下常见的操作和配置
目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd(/etc/vsftpd/vsftpd.conf) 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...
HTTP(超文本传输协议)
HTTP是万维网通信的基础构成,是一个简单的请求相应协议,基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析,将域名化为IP访问 建立TCP连接 如图,客户端先发送一个sys置位seq为x(任意值)的…...
etcd-v3.5release-(3)-readIndexRead
笔记1:读操作包括两种,readIndex和serilizable,readIndex指一致性读,一旦a读到了数据x,那么a及a以后的数据都能读到x,readIndex读会先确认本leader是不是有效地leader,如果有效则记录此刻的comm…...
IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置
NA消息用单播还是多播的判断理由 单播回复(Unicast): 如果客户端发送 RS 消息时,使用的是一个全局地址或链路本地地址作为源地址,则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量,…...
C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数
知识要点:数组作函数参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序,前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...
PostgreSQL数据库连接:psqlODBC驱动安装与配置实战指南
本文还有配套的精品资源,点击获取 简介:本文将提供详细的psqlODBC驱动程序在Windows操作系统上的安装和配置指南,使用户能够通过ODBC标准连接到PostgreSQL数据库。安装步骤涵盖获取安装文件、运行安装向导、选择安装路径、完成安装以及配置…...
【NLP 8、normalization归一化函数:sigmoid、softmax】
目录 Normalization(归一化) 1.特点 目的 应用场景 输出范围 2. Sigmoid 函数 目的 应用场景 输出范围 3. Softmax 函数 目的 应用场景 输出范围 "燃尽最后的本能,意志力会带你杀出重围" —— 24.12.2 Normalization&#…...
鸿蒙ArkTS 与安卓Android-底层逻辑对比
鸿蒙OS(ArkTS) 架构: 鸿蒙OS采用了微内核架构,其核心操作系统将设备的硬件资源和服务进行模块化,微内核负责最基本的服务(如调度、通信、同步等),而其他功能则由用户空间的进程提供。…...
第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】
摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计算机显示直线,它确定应该选择的n维光栅的点&#…...
唇形同步视频生成工具:Wav2Lip
一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip;Wav2Lip是一种用于生成唇形同步(lip-sync)视频的深度学习算法,它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 (Paper) Wav2Lip模型…...
旅游管理系统的设计与实现
文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:旅游管理系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候&#…...
burp常用机漏洞测试理论
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
