前端下载文件的几种方式

article/2025/8/24 8:57:40

一、a标签download下载
后端返回一个可下载的url文件,或者前端本地保存的文件,通过路径引入下载。
(1)将资源放入前端本地保存,打包后随一起上传自服务器
在这里插入图片描述

// 本地资源下载,引入路径即可,这里的路径指的是打包后文件与代码文件的相对路径
<a href="./import-template.xlsx" download target="_blank">下载上传模板 
</a>

(2)请求服务器,返回的url放入a标签的href属性中,
下面是伪代码,实现的步骤 先获取url,将其作为变量,放入a标签的href属性中,不同的框架方法不同。

let requestUrl = 'xxxxxx';
let responseUrl = '';
fetch(requestUrl ).then(res => {responseUrl = res.data.url
})// dom节点渲染如果responseUrl出现跨域,download将失效,无法下载
<a href=`${responseUrl }` download target="_blank">下载上传模板 
</a>

(3) 不依赖框架,原生js实现点击下载的方式

//点击某个按钮触发事件const onClickDownFile = (id) => {
let requestUrl = `xxxxxx${id}xxxx`;
fetch(requestUrl).then(res => {//为了解决a标签跨域无法下载的问题const x = new XMLHttpRequest();x.open('GET', res.data.url, true);x.responseType = 'blob';x.onload = () => {const dataurl = window.URL.createObjectURL(x.response);const a = document.createElement('a');a.href = res.data.url;a.download = res.data.url;a.click();a.remove();};x.send();
})};

二、后端接口返回二进制流,前端需要接收处理

import { stringify } from 'qs';type Method = 'GET' | 'POST';/*** 下载文件* @param url 接口路径* @param data 请求的参数* @param method 请求方式* @param type 下载文件的类型* @param fileName 自定义文件名称*/
export const download = (url: string,data: any,method: Method,type: string,fileName?: string,
) => {/** fetch 配置项 */const params: RequestInit = {method,headers: {Authorization: '','response-type': 'arraybuffer',},};if (method === 'GET') {// 每次请求添加时间戳,避免 GET 请求遭遇 HTTP 缓存data._ = new Date().getTime();// 请求参数合并到 URL 上url += `?${stringify(data)}`;} else {params.body = JSON.stringify(data);}return fetch(url, params).then((response) => {if (response.status === 200 && response.body) {if (!fileName) {const cd = response.headers.get('content-disposition');const cds = cd?.split('filename=') || [];if (cds[1]) {fileName = decodeURIComponent(cds[1]);}}return response.blob();}return Promise.reject();}).then((_blob) => {const blob = new Blob([_blob], {type,});const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);link.download = fileName || 'file';link.click();return 'done';});
};

使用方式

download('xxxx',{},"GET", //或者"POST"'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',fileName, //文件名称)

type是文件类型,不同的文件类型type不同

后缀MIME Type
.docapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.xlsapplication/vnd.ms-excel
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.pptapplication/vnd.ms-powerpoint
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation

三、后端视情况返回二进制流文件。
我在一个项目中遇到这样一个需求,前端导入文件,后端解析并返回结果,如果成功,返回的data为null,code为0,如果失败,返回一个excel的二进制流文件,在excel文件中显示的是失败的原因,并自动下载文件。


const downloadBlob = (blob: Blob, type: string, fileName?: string) => {const newBlob = new Blob([blob], {type,});const link = document.createElement('a');link.href = window.URL.createObjectURL(newBlob);link.download = fileName || '错误文件';link.click();
};export const FileUpload = (url: string, file: FormData): Promise => {/** fetch 配置项 */const params: RequestInit = {method: 'POST',headers: {Authorization: '',},body: file,};return fetch(url, params).then((response) => {if (response.status === 200 && response.body) {return new Promise((resolve, reject) => {const contentType = response.headers.get('content-type') || '';if (contentType.indexOf('application/json') >= 0) {// 返回的是 JSON 文件response.json().then(resolve);} else if (contentType.indexOf('application/vnd.ms-excel') >= 0) {// 返回的是 excel 文件response.blob().then((_blob) => {const cd = response.headers.get('content-disposition');const cds = cd?.split('filename=') || [];downloadBlob(_blob,'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',decodeURIComponent(cds[1]),);resolve();});} else {reject();}});}return Promise.reject();});
};

content-type 的类型有很多种,每一种对应不同的返回类型,
content-type对照大全 : https://tool.oschina.net/commons/


http://chatgpt.dhexx.cn/article/biBv8v4B.shtml

相关文章

这里有11种方法,供你用Python下载文件

今天我们一起学习如何使用不同的Python模块从web下载文件。此外&#xff0c;你将下载常规文件、web页面、Amazon S3和其他资源。 最后&#xff0c;你将学习如何克服可能遇到的各种挑战&#xff0c;例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他策略。 1、使…

15种下载文件的方法

转载&#xff1a;https://blog.netspi.com/15-ways-to-download-a-file/ 瑞恩甘德鲁德 原创时间&#xff1a;2014年6月16日 Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升&#xff0c;或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的…

【基础知识】---概率密度函数和似然函数的区别

这个是quora上的一个回答 What is the difference between probability and likelihood? 在评论中这位老师将概率密度函数和似然函数之间的关系&#xff0c;类比成 2b 和 a2 之间的关系。详细翻译如下&#xff1a; 2我们可以做一个类比&#xff0c;假设一个函数为 ab&#x…

概率论考点之多维随机变量及密度函数

如题&#xff1a;2019年10月 分析&#xff1a;概率论是最初要考的一个科目&#xff0c;看了好几遍了吧&#xff0c;总还是没印象。可见别人讲得再天花乱坠&#xff0c;自己不懂&#xff0c;一点用都没有&#xff0c;白白浪费时间。知识&#xff0c;要靠自己去掌握。 还是借此顺…

最大最小次序统计量密度函数的推导

今天在推导最小统计量时出现了一些错误。及时分享出来&#xff0c;和朋友们一起反思进步。 我的错误是&#xff1a;分布函数的定义搞错了。我一心想着让所有样本都大于x&#xff08;1&#xff09;所以在原本是小于等于的位置写成了大于&#xff0c;推导最后多出一个负号。 反思…

矩阵分析与应用-06-概率密度函数01

概率密度函数 实随机向量的概率密度函数 一个含有m 个随机变量的实值向量 称为mx1实随机向量&#xff0c;或简称随机向量(当维数无关紧要时)。其中&#xff0c;表示样本点&#xff0c;可以是时间&#xff0c;频率&#xff0c;或者位置等。 一个随机向量由它的联合累积分布函…

概论_第3章_二维随机变量_已知概念密度函数求分布函数

首先看定义 一 定义 设二维随机变量(X, Y)的分布函数为F(x, y), 若存在非负可积函数f(x, y), 使得对任意的实数 x, y, 有 ,则称(X, Y)为二维连续型随机变量&#xff0c; 称f(x, y)为(X, Y)的概率密度或X与Y的联合密度函数。 二 例题 题 1 设二维随机变量(X, Y)的概率密度为 , 求…

概论_第3章_已知联合密度求边缘密度

一 例题 设二维随机变量(X, Y)的概率密度为 &#xff0c; 求边缘概率密度。 解&#xff1a; 先画图 所以, X的边缘密度为 Y的边缘密度为 总结: 求X的边缘密度 是对y求积分&#xff0c; 会带上dy, 因此要确定y的上下限&#xff0c; 注意确定上下限 时作一个垂直于x轴的箭头线…

联合密度分布

最近参与翻译的一本书&#xff0c;以下是我翻译的其中一章&#xff0c;其余可以阅读 https://github.com/apachecn/prob140-textbook-zh 英文原文&#xff1a;https://nbviewer.jupyter.org/github/prob140/textbook/tree/gh-pages/notebooks/ 17. 联合密度 我们现在开始研…

连续型随机变量+分布函数+密度函数+联合分布函数

1.先验知识 连续型随机变量&#xff1a; 随机变量 X 取值无法全部列举。 数学定义&#xff1a; 随机变量 X&#xff0c;存在一个非负可积函数 f(t) ,使得对任意 x ,有 则称 X 为连续型随机变量。其中 f(t) 为 X 的概率密度函数。 概率分布函数&#xff08;简称&#xff1a;分布…

联合密度函数求期望_联合密度函数的数学期望怎么求

展开全部 数学期望是试验中每次可能结果的概率636f707962616964757a686964616f31333433623039乘以其结果的总和。 计算公式&#xff1a; 1、离散型&#xff1a; 离散型随机变量X的取值为X1、X2、X3……Xn&#xff0c;p(X1)、p(X2)、p(X3)……p(Xn)、为X对应取值的概率&#xff…

概率论

概率论 概率的性质 减法公式 A-BAB的逆 应用 画图更简单 abc至少有一个发生表示 P(A并B并C) P&#xff08;ABC&#xff09;《P&#xff08;AB&#xff09;0 条件概率的性质 应用 古典概型 应用: 不放回抽样 全概率公式和贝叶斯公式 全概率公式的使用条件:A事件可以被多个事…

20、PPP协议

前面我们分了五节的内容&#xff0c;用了很大的篇幅介绍了局域网的数据链路层的知识&#xff0c;在这其中主要是以太网的相关内容。本节开始我们学习广域网的数据链路层协议&#xff0c;主要学习两种&#xff0c;PPP和HDLC。 PPP协议的特点 PPP全称“Point-to-Point Protocol”…

PPP协议和HDLC协议

广域网 广域网&#xff08;WAN&#xff0c;Wide Area Network&#xff09;&#xff0c;通常跨接很大的物理范围&#xff0c;所覆盖的范围从几十公里到几千公里&#xff0c;它能连接多个城市或国家&#xff0c;或跨越几个洲并能提供远距离通信&#xff0c;形成国际性的远程网络…

PPP协议的简单了解

一.PPP协议的概述&#xff1a;、 PPP协议&#xff0c;即点对点协议&#xff08;应用在直接相连的两个结点的链路上&#xff09;&#xff0c; 全称&#xff1a;Point-to-Point Protocol PPP协议使用的是串行线路通信&#xff0c;面向字节。 设计目的&#xff1a;建立建立点对点…

数据链路层的PPP协议

互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。 PPP协议有三个组成部分: &#xff08;1&#xff09;一个将IP数据报封装到串行链路的方法。PPP既支持异步链路&#xff08;无奇偶检验的8比特数据&#xff09…

PPP协议基础与工作流程

PPP概述 简介&#xff1a; PPP是点到点链路上承载网络层数据报文的一种链路层协议&#xff0c;如路由器中的Serial接口链路缺省运行的协议就是PPP&#xff0c;当然能够允许PPP的远不止Serial这一种端口&#xff0c;其他例如Dialer&#xff0c;虚拟模板接口等都可以运行&#x…

ppp协议过程

PPP协议------点到点协议 1&#xff0c;兼容性强&#xff0c;有统一的版本&#xff0c;并且只要是支持全双工的串线&#xff0c;都可用ppp协议进行封装。&#xff08;全双工两点间A可以给B发信息&#xff0c;B也可以给A发信息&#xff0c;且可以同时发&#xff09; 2&#xff0…

ppp 协议简介

1 点对点协议PPP&#xff08;Point-to-Point Protocol&#xff09; PPP(Point-to-Point Protocol)&#xff0c;链路层协议。PPP是为了在点对点物理链路(例如RS232串口链路、电话ISDN线路等)上传输OSI模型中的网络层报文而设计的&#xff0c;它改进了之前的一个点对点协议-SLIP…

PPP协议

目录 PPPPPP成员协议PPP建立流程PPP状态机PPP认证方式 PPP 点对点协议PPP也称P2P&#xff0c;主要用在全双工的同异步链路上进行点到点的数据传输。 PPP成员协议 链路控制协议&#xff08;LCP&#xff09;&#xff1a;用来建立、拆除和监控PPP数据链路。LCP包括的参数有最大…