前端导出文件,下载文件,downloadFile 方法汇总

前端文件下载有多种方法,每种方法适用于不同的场景。以下是几种常见的前端文件下载方法及其示例代码:

1. 直接设置 <a> 标签的 href 属性

适用于简单的文件下载,服务器会自动响应带有 Content-Disposition: attachment 头的文件。

function downloadFile(url, filename, token) {// 创建一个隐藏的 <a> 元素const a = document.createElement('a');a.style.display = 'none';// 检查 URL 是否已经包含查询参数const urlWithToken = url.includes('?') ? `${url}&token=${encodeURIComponent(token)}`: `${url}?token=${encodeURIComponent(token)}`;// 设置 <a> 元素的 href 属性为带有 token 的 URLa.href = urlWithToken;// 设置下载的文件名a.download = filename || 'download';// 将 <a> 元素添加到文档中document.body.appendChild(a);// 触发点击事件a.click();// 移除 <a> 元素document.body.removeChild(a);
}// 调用函数
downloadFile('https://example.com/path/to/file.pdf', 'file.pdf', 'yourTokenValue');

2. 使用 fetch API 下载 Blob 文件

适用于需要处理文件内容的情况,例如从服务器获取文件内容后手动触发下载。

function downloadFile(url, filename, token) {fetch(url, {method: 'GET',headers: {'Authorization': `Bearer ${token}`,// 其他头部信息}}).then(response => {if (!response.ok) {throw new Error('Network response was not ok ' + response.statusText);}return response.blob();}).then(blob => {const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename || 'download';a.style.display = 'none';document.body.appendChild(a);a.click();window.URL.revokeObjectURL(url);document.body.removeChild(a);}).catch(error => {console.error('Download failed:', error);});
}// 调用函数
downloadFile('https://example.com/path/to/file.pdf', 'file.pdf', 'yourTokenValue');

3. 使用表单提交

适用于需要携带参数或进行 POST 请求的情况。

<form id="downloadForm" action="https://example.com/download" method="POST" target="_blank"><input type="hidden" name="token" value="yourTokenValue"><!-- 其他需要的输入字段 -->
</form><script>document.getElementById('downloadForm').submit();
</script>

4. 使用 iframe 触发下载

适用于不需要用户交互的文件下载。

<iframe id="downloadIframe" style="display:none;"></iframe><script>function triggerDownload(url) {const iframe = document.getElementById('downloadIframe');iframe.src = url;}// 调用函数triggerDownload('https://example.com/path/to/file.pdf');
</script>

5. 使用 XMLHttpRequest 下载 Blob 文件

适用于需要兼容旧浏览器的情况。

function downloadFile(url, filename, token) {const xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.setRequestHeader('Authorization', `Bearer ${token}`);xhr.responseType = 'blob';xhr.onload = function() {if (this.status === 200) {const blob = this.response;const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = filename || 'download';a.style.display = 'none';document.body.appendChild(a);a.click();window.URL.revokeObjectURL(url);document.body.removeChild(a);} else {console.error('Download failed:', this.statusText);}};xhr.onerror = function() {console.error('Download failed:', this.statusText);};xhr.send();
}// 调用函数
downloadFile('https://example.com/path/to/file.pdf', 'file.pdf', 'yourTokenValue');

6. 使用 BlobFileSaver.js

FileSaver.js 是一个第三方库,可以简化文件下载操作。

首先,安装 FileSaver.js

npm install file-saver

然后在代码中使用:

import { saveAs } from 'file-saver';function downloadFile(url, filename, token) {fetch(url, {method: 'GET',headers: {'Authorization': `Bearer ${token}`, // 添加 token 到请求头// 其他头部信息}}).then(response => {if (!response.ok) {throw new Error('Network response was not ok ' + response.statusText);}return response.blob();}).then(blob => {saveAs(blob, filename || 'download');}).catch(error => {console.error('Download failed:', error);});
}// 调用函数
downloadFile('https://example.com/path/to/file.pdf', 'file.pdf', 'yourTokenValue');

总结

  • 直接设置 <a> 标签的 href 属性:适用于简单的文件下载。
  • 使用 fetch API 下载 Blob 文件:适用于需要处理文件内容的情况。
  • 使用表单提交:适用于需要携带参数或进行 POST 请求的情况。
  • 使用 iframe 触发下载:适用于不需要用户交互的文件下载。
  • 使用 XMLHttpRequest 下载 Blob 文件:适用于需要兼容旧浏览器的情况。
  • 使用 BlobFileSaver.js:适用于需要简化文件下载操作的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【亚马逊云科技】使用Amazon Lightsail搭建nginx服务

文章目录 前言一、为什么选择Amazon Lightsail二、创建账号与登录注册亚马逊账号登录控制台 三、创建Amazon Lightsail进入控制台创建实例登录服务器部署nginx服务关闭防火墙 总结 前言 不论是个人名片还是官方网站都离不开网站建设工作。计算机技术经历漫长的发展&#xff0c…

南京大学苏州校区学生代表团到访合合信息,开启“沉浸式”人工智能企业行

为进一步深化校企合作&#xff0c;探索产业科技拔尖创新人才培养新模式&#xff0c;近期&#xff0c;南京大学苏州校区师生代表到访上海合合信息科技股份有限公司&#xff08;以下简称“合合信息”&#xff0c;股票代码&#xff1a;SH688615&#xff09;。此次活动设置了展厅讲…

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试&#xff0c;于是配置并记录了一下&#xff1a; 首先运行ros接口的dm-vio&#xff0c;一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压&#xff0c;并安装一下依赖&#xff1a; sudo apt-get install …

pageoffice最新版本浏览器点击没反应解决办法

一、问题现象 最新版本的谷歌、火狐浏览器&#xff0c;调用pageoffice时&#xff0c;点击后没反应&#xff08;旧的谷歌浏览器不受影响&#xff09;。 二、产生原因 服务器返回pageOffice的客户端唤起链接格式为&#xff1a; PageOffice://|http://192.168.1.120:8080/xxx …

【Linux相关】服务器无网情况配置conda

【Linux相关】 服务器无网情况配置conda 文章目录 环境配置1. 本地下载miniconda&#xff0c;传到服务器2. 确认安装包是否传送成功3. 确保有安装权限4. 安装5. 写路径6. 看一下是否成功 环境配置 ssh的话&#xff0c;服务器连不上网&#xff0c;无法在线下载&#xff0c;需要本…

鸿蒙学习使用模拟器运行应用(开发篇)

文章目录 1、系统类型和运行环境要求2、创建模拟器3、启动和关闭模拟器4、安装应用程序包和上传文件QA:在Windows电脑上启动模拟器&#xff0c;提示未开启Hyper-V 1、系统类型和运行环境要求 Windows 10 企业版、专业版或教育版及以上&#xff0c;且操作系统版本不低于10.0.18…

Android studio 签名加固后的apk文件

Android studio打包时&#xff0c;可以选择签名类型v1和v2&#xff0c;但是在经过加固后&#xff0c;签名就不在了&#xff0c;或者只有v1签名&#xff0c;这样是不安全的。 操作流程&#xff1a; 1、Android studio 对项目进行打包&#xff0c;生成有签名的apk文件&#xff…

【科研】9如何高效阅读和理解学术论文

【科研】9如何高效阅读和理解学术论文 写在最前面一、为什么需要系统的阅读方法&#xff1f;二、阅读论文的11步方法三、实践示例四、常见问题解答五、结语 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ …

3.22【计组】 流水线加法器

实验一 timescale 1ns / 1ps/* ALU模块实现两个32bit数的add、sub、and、or、not、slt功能&#xff0c; 但由于Nexy7输入口限制&#xff0c;将num1简化为8位&#xff0c;在过程中再extend成32位&#xff0c;num2作为内部wire自行赋值&#xff0c;此处赋为5 由于最后的结果在to…

算法与数据结构练习——异或

知识点讲解&#xff1a; 一、异或操作定义&#xff1a; 异或是指相同为0&#xff0c;不同为1&#xff0c;也可理解为无进位相加&#xff01;&#xff01; 很重要&#xff01;&#xff01; 二、关于异或运算的几个性质&#xff1a; 1.0^NN &#xff08;0和任何数异或都…

计算机的错误计算(一百六十九)

摘要 探讨 MATLAB 中一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然&#xff0c;每个 均为 0.5 . 下面看看 MATLAB 的计算结果。不妨不用循环语句&#xff0c;直接用算术表达式表示 这时计算结果在如下图片&#xff1a; …

11.25.2024刷华为OD

文章目录 HJ76 尼科彻斯定理&#xff08;观察题&#xff0c;不难&#xff09;HJ77 火车进站&#xff08;DFS&#xff09;HJ91 走格子方法&#xff0c;&#xff08;动态规划&#xff0c;递归&#xff0c;有代表性&#xff09;HJ93 数组分组&#xff08;递归&#xff09;语法知识…

思科实现网络地址转换(NAT)和访问控制列表(ACL)和动态路由配置并且区分静态路由和动态路由配置。

实验拓扑(分为静态路由和动态路由两种) 静态路由互通 动态路由互通 实验背景 这个是想实现外网与内网的连接跟网络的探讨&#xff0c;最终实现互通以及使用并且在网络地址转换后能使用网络然后再这个基础上再配置访问控制列表和网络地址转换的的学习过程。 实验需了解的知识…

Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。

写这篇文章的目的是为了提供一个新的解决思路&#xff0c;因为存在同病不同原因。 如果你进行了1. 检查运行配置 (Run Configuration) 2. 清理和重建项目 3. 清除缓存并重启 IDEA 4.排除kotlin 5.重装idea等等操作之后仍然没有解决&#xff0c;可以试着按一下步骤进行解决。 检…

数据结构--树二叉树顺序结构存储的二叉树(堆)

前言 前面我们学习了顺序表、链表、栈和队列&#xff0c;这些都是线性的数据结构。今天我们要来学习一种非线性的数据结构——树。 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;是由n&#xff08;n≥0&#xff09;个有效结点组成的一个具有层次关系的集合…

qt QProxyStyle详解

1、概述 QProxyStyle是Qt框架中QStyle类的一个子类&#xff0c;它提供了一种代理机制&#xff0c;允许开发者在不直接修改现有样式&#xff08;QStyle&#xff09;实现的情况下&#xff0c;对样式行为进行定制或扩展。通过继承QProxyStyle&#xff0c;开发者可以重写其虚方法&…

STL基本算法之copy与copy_backward

copy 不论是对客端程序或对STL内部而言&#xff0c;copy()都是一个常常被调用的函数。由于copy进行的是复制操作&#xff0c;而复制操作不外乎应用assignment operator或者copy construct(copy 算法用的是前者)&#xff0c;但是某些元素型别拥有的是trivial assignment operato…

不可分割的整体—系统思考的微妙法则

不可分割的整体——系统思考的微妙法则 作为企业领导者&#xff0c;我们经常需要做出决策&#xff0c;但有时候&#xff0c;我们会忽略一个事实&#xff1a;每个决策都不是孤立的&#xff0c;它背后都是一个复杂系统的一部分。 无论是市场动态、团队协作&#xff0c;还是产品…

云计算基础-期末复习

第一章&#xff1a;云计算概论 一、云计算的定义与特征 1. 定义&#xff1a; 云计算是一种通过网络以按需、可扩展的方式获取计算资源和服务的模式。它将计算资源视为一种公用事业&#xff0c;用户可以根据需求动态获取和释放资源&#xff0c;而无需了解底层基础设施的细节。…

基于Java的小程序电商商城开源设计源码

近年来电商模式的发展越来越成熟&#xff0c;基于 Java 开发的小程序电商商城开源源码&#xff0c;为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行&#xff0c;可以实现管理员&#xff1b;首页、个人中心、用户…