前端实现文件下载的方法

一、简介

​ 之前我分享过《前端实现图片下载的方法》,但那只是针对图片下载的方法。本博客分享的是对于文件的下载方法,包括图片文件和非图片文件的下载,例如pngdocpdfppt等等。

​ 当然,还是那个大前提:在任何方案下,前端都无法绕过跨域的限制,所以如果存在跨域,那需要文件所在的服务器对当前域名开放权限,即服务器在其响应中包含适当的 CORS 头部允许跨域请求,否则是无法下载的。

二、具体方案

1、a标签跳转下载

​ 该方式是最常用,也是最简单的方案,只需在文件资源服务器端进行配置之后,前端通过<a>标签新开页面跳转对应链接,即可实现文件的下载。

​ 该方案缺点是某些情况下无法指定文件下载到本地时的名称,本地文件的名称取决于文件资源服务器的文件名称。其次是如果下载文件是图片文件,则只能下载同源URL或blob:data: 协议的文件,对于非同源的图片只能实现查看。

<a href="https://****fileUrl" target="_blank" >下载文件</a>
2、ajax请求+a标签

​ 该方案是通过ajax请求,获取到blob类型的文件数据流,然后再将文件数据流转换成URL对象,最终再通过<a>标签实现下载。下载时可以自定义指定文件下载到本地时的名称。而且获取blob类型的数据,只需要前端配置ajax请求的responseType属性即可。

​ 但该方案缺点是:需要将整个文件内容加载到内存中,然后再触发下载,如果下载文件过大,可能导致浏览器崩溃或者长时间无响应。

具体代码:
/*
  url: 要下载文件的url
  fileName: 指定下载后文件的名称
*/
const downloadFile = async (url: string, fileName: string) => {  
  // 创建XMLHttpRequest对象
  const http = new XMLHttpRequest();
  // 设置请求方式和请求地址
  http.open("GET", url);
  // 设置响应数据类型为blob
  http.responseType = "blob";
  // 监听绑定请求完成事件
  http.onload = function() {
    // 判断请求是否成功
    if (http.status === 200) {
      // 获取响应数据
      const blob = http.response;
      // 将blob数据 转为 URL 对象
      let downloadUrl = URL.createObjectURL(blob);
      // 创建一个临时的 a 标签用于触发下载
      let a = document.createElement('a');
      // 将url对象赋值给 a 标签的 href 属性
      a.href = downloadUrl;
      // 指定下载文件的名称 如果没有指定,则默认使用url中的最后一部分作为文件名
      a.download = fileName || url.split('/').pop() as string; 
      // 将a标签添加到dom中
      document.body.appendChild(a);
      // 触发a标签的点击事件 开始下载文件
      a.click(); 

      // 清理:撤销创建的 URL 对象
      URL.revokeObjectURL(downloadUrl);
      // 并移除添加的 a 标签
      document.body.removeChild(a);
    }
  }
  // 监听绑定请求失败事件
  http.onerror = function() {
    console.log('下载失败,请重试或联系客服人员~');
  }
  // 发送请求
  http.send();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos安装/更新Docker

首先要配置好Centos 配置好静态IP 替换yum源为阿里云 Docker是什么&#xff1f; Docker 是一种开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后部署到任何流行的 Linux 机器上。是一种虚拟化的技术&#xff0c;可以把…

基于socket编程实现TCP和UDP的通信流程

socket编程的常用函数&#xff0c;可以参考以下这篇博客 socket编程-----常用socket编程函数https://blog.csdn.net/ZZZCY2003/article/details/138071210 关于TCP的三次挥手、四次挥手过程和UDP的报文分析可以参考以下两篇博客 计算机网络--运输层https://blog.csdn.net/ZZ…

深度学习-N维数组和访问元素

目录 N维数组访问元素 N维数组 N维数组是机器学习和神经网络的主要数据结构 访问元素 最后一个子区域中的::是跳的意思&#xff0c;这个区域说明的是从第一个元素&#xff08;即第一行第一列那个&#xff09;对行开始跳3下循环下去直到行结束、对列开始跳2下循环下去直到列…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

&#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e; 文章目录 &#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e;摘要引言正文&#x1f4d8; 识别问题&#x1f4d9; 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…

C++初阶之入门

零、什么是C C是基于C语言而产生的&#xff0c;它既可以进行C语言的过程化程序设计&#xff0c;又可以进行以抽象数据类型为特点的基于对象的程序设计&#xff0c;还可以进行面向对象的程序设计。 C缺点之一&#xff0c;是相对许多语言复杂&#xff0c;而且难学难精。许多人说学…

为什么g++编译后的cpp文件名字为a,out

文章目录 为什么g编译后的cpp文件名字为a,out能修改默认名变成cpp文件名吗关于作者 为什么g编译后的cpp文件名字为a,out 在使用g编译C源代码时&#xff0c;默认情况下生成的可执行文件名为 a.out。这是由于在Unix和类Unix系统上&#xff0c;编译器的默认行为是将生成的可执行文…

可视化+多人协同技术原理和案例分享

前言 hi&#xff0c;大家好&#xff0c;我是徐小夕&#xff0c;之前和大家分享了很多可视化低代码的技术实践&#xff0c;最近也做了一款非常有意思的文档搭建引擎——Nocode/Doc&#xff1a; 也做了一些分享&#xff1a; Nocode/Doc&#xff0c;可视化 零代码打造下一代文件编…

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…

Rust HTTP 客户端:易于使用、功能强大 | 开源日报 No.228

seanmonstar/reqwest Stars: 8.9k License: Apache-2.0 reqwest 是一个易于使用且功能强大的 Rust HTTP 客户端。 异步和阻塞客户端支持普通数据、JSON、urlencoded 和 multipart 数据格式可定制的重定向策略支持 HTTP 代理和系统原生 TLS 或 rustls 的 HTTPSCookie 存储功能…

RoadBEV:鸟瞰图中的道路表面重建

1. 代码地址 GitHub - ztsrxh/RoadBEV: Codes for RoadBEV: road surface reconstruction in Birds Eye View 2. 摘要 本文介绍了RoadBEV&#xff1a;鸟瞰图中的道路表面重建。道路表面条件&#xff08;特别是几何形状&#xff09;极大地影响了自动驾驶汽车的驾驶性能。基于…

就业班 第三阶段(nginx) 2401--4.22 day1 nginx1 http+nginx初识+配置+虚拟主机

一、HTTP 介绍 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件…

ubuntu安装Qv2ray2.7.0及配置

需要下载两个文件&#xff0c;一个是zip文件&#xff0c;一个是AppImage执行程序。 执行AppImage需要先下载fuse sudo apt install libfuse2然后为AppImage赋予执行权限 sudo chmod x ./Qv2ray-v2.7.0-linux-x64.AppImage执行,执行前可以解压zip文件 ./Qv2ray-refs.tags.v1…

操作系统(Operating System)知识点复习——第十一章 I/O管理与磁盘调度

目录 0.前言 1.I/O设备 2.I/O功能的组织 3.Operating System Design Issues 4.I/O缓冲 4.1 单缓冲Single Buffer 4.2 双缓冲Double Buffer 4.3 循环缓冲 5.磁盘调度Disk Scheduling 5.1 磁盘性能参数 5.2 磁盘调度策略 ①First-in&#xff0c;first-out(FIFO) ②Pr…

鸿蒙ArkUI实战开发-如何通过上下滑动实现亮度和音量调节

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小&#xff0c;本例即为大家介绍如何实现上述UI效果。 说明&#xff1a; 由于当前亮度和音量调节功能仅对系统应用开发&#xff0c;所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下&#xff1a; 当在…

决策树分析及其在项目管理中的应用

决策树分析是一种分类学习方法&#xff0c;其主要用于解决分类和回归问题。在决策树中&#xff0c;每个内部节点表示一个属性上的测试&#xff0c;每个分支代表一个属性输出&#xff0c;而每个叶节点则代表类或类分布。通过从根节点到内部节点的路径&#xff0c;可以构建一系列…

Haystack

文章目录 关于 Haystack提供 NLP项目所有阶段的功能 Building blocks组件 Components管道 Pipelines代理 Agents 基本使用 - RAG 关于 Haystack 官网&#xff1a;https://haystack.deepset.ai官方文档&#xff1a;https://docs.haystack.deepset.ai/docs/intro教程&#xff1a…

IP地址定位是怎么实现的?

IP地址定位技术的实现是一个涉及多方面技术和方法的复杂过程。IP地址作为互联网通信中的关键元素&#xff0c;每个设备在网络中都被分配一个唯一的IP地址&#xff0c;用于标识和定位网络上的设备。通过一系列技术手段&#xff0c;我们可以对这些IP地址进行分析&#xff0c;进而…

MATLAB 向量

MATLAB 向量 向量是一维数字数组。MATLAB允许创建两种类型的向量 行向量 列向量 行向量 行向量通过将元素集括在方括号中并使用空格或逗号定界元素来创建。 示例 r [7 8 9 10 11] MATLAB将执行上述语句并返回以下结果- r 7 8 9 10 11 列向量 列向量 通过将元素集括在方…

大型网站系统架构演化实例_6.使用分布式文件系统和分布式数据库系统

1.使用分布式文件系统和分布式数据库系统 任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后&#xff0c;从一台服务器拆分成两台服务器&#xff0c;但是随着网站业务的发展依然不能满足需求&#xff0c;这时需要使用分布式数据库。文件系统也一…

【高校科研前沿】东北地理所在遥感领域顶刊RSE发布中国主要红树植物群落遥感分类成果

目录 01 文章简介 02 研究内容 03 文章引用 01 文章简介 论文名称&#xff1a;Mangrove species mapping in coastal China using synthesized Sentinel-2 high-separability images&#xff08;基于Sentinel-2高分离度图像的中国沿海红树群落制图&#xff09; 第一作者及…
最新文章