1.比较常见的是通过a标签的href属性直接访问文件url地址。

(1)
const downloadUrl = (url: string, file_name?: string) => {
if (url) {
url = url.replace(/^http/, "https");
const a = document.createElement("a");
a.href = url + `?attname=${file_name || "doc"}`;
a.download = file_name || "doc";
a.click();
}
};
(2)attname参数值需要带扩展名,要不然识别不了文件类型。这种方式下载一些不用验证的资源是可以,
但如果下载接口需要验证,需要你在请求头带token,这种方式就行不通了(可以看到浏览器下载进度)
  <a href="文件url?attname=filename.jpg">xxx</a>(可以看到浏览器下载进度)
 <a href="http://www.baidu.com" download="baidu.html">下载</a>(无法看到浏览器下载进度)

2、window.open

window.open('http://www.baidu.com', '_blank', 'download=baidu.html')

当然这种方式也是有缺陷的,对比于a标签,这种方式不能下载.html.htm.xml.xhtml等文件,因为这些文件会被当成html文件来处理,所以会直接在当前页面打开。

同样也不能下载跨域的文件,毕竟是window.open,不是window.downloadwindow.download是假想)。

3、文件流下载,通过接口下载

 * @Description:
        参数注释: (fileName: string, url: string, exportDate?: boolean)
        fileName: 下载文件名
        url: 文件地址
        exportDate: 是否是导出文件流
 *
export default function (fileName?: string, url?: string, exportDate?: boolean) {
if (!url) {
ElMessage({
type: "warning",
message: "下载地址为空,无法下载"
});
return;
}
url = url.replace(/http:/, "");
const x = new XMLHttpRequest();
x.open("GET", url, true);
if (exportDate) {
const session = getSession("user", true) as USER; // 你的token
if (session) {
x.setRequestHeader("Authorization", `Bearer ${session.token}`);
}
} x.responseType = "blob"; x.onload = function () {
let xlsxName = null;
if (exportDate) {
xlsxName = fileNameHeader(x.getResponseHeader("Content-Disposition"));
}
const url = window.URL.createObjectURL(x.response);
const a = document.createElement("a");
a.href = url;
if (exportDate) {
a.download = xlsxName || "file";
} else {
a.download = fileName || "file";
} a.click();
};
x.send();
} function fileNameHeader(d: any) {
let result = null;
if (d && /filename=.*/gi.test(d)) {
result = d.match(/filename=.*/gi);
return decodeURI(result[0].split("=")[1]);
}
}

4、批量下载生产压缩包

import axios from "axios";
import JSZip from "jszip";
import FileSaver from "file-saver"; const getFile = (url: string) => {
return new Promise((resolve, reject) => {
axios({
method: "get",
url,
responseType: "arraybuffer"
})
.then((data) => {
resolve(data.data);
})
.catch((error) => {
reject(error.toString());
});
});
}; export default function batchDownload(urlArr: any, name?: string, arrChildName?: string[]) {
const data: string[] = urlArr; // 需要下载打包的路径, 可以是本地相对路径, 也可以是跨域的全路径
const zip = new JSZip();
const cache: any = {};
const promises: string[] = [];
data.forEach((item, index) => {
const promise: any = getFile(item).then((data: any) => {
// 下载文件, 并存成ArrayBuffer对象
const arr_name = item.split("/");
let file_name = arr_name[arr_name.length - 1]; // 获取文件名
if (arrChildName && arrChildName.length) {
file_name = arrChildName[index];
}
zip.file(file_name, data, { binary: true }); // 逐个添加文件
cache[file_name] = data;
});
promises.push(promise);
}); Promise.all(promises).then(() => {
zip.generateAsync({ type: "blob" }).then((content) => {
// 生成二进制流
FileSaver.saveAs(content, name || "打包下载.zip"); // 利用file-saver保存文件
});
});
}

前端下载的方式总结(url,文件流,压缩包)的更多相关文章

  1. .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)

    .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...

  2. Java浏览器弹出下载框,多个文件导出压缩包

    项目里一直有这个功能,也一直没怎么注意,今天研究了一下 依据逻辑往下走: 首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管: Map<String, Object> ...

  3. fetch的文件流下载及下载进度获取

    下载过程中,获取进度,fetch API并没有提供类似xhr和ajax的 progress所以用 getReader()来循环读取大小 let size = 0; fetch( URL() + `/s ...

  4. js 前端实现文件流下载的几种方式

    后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...

  5. web api 如何通过接收文件流的方式,接收客户端及前端上传的文件

    服务端接收文件流代码: public async Task<HttpResponseMessage> ReceiveFileByStream() { var stream = HttpCo ...

  6. Vue.js +pdf.js 处理响应pdf文件流数据,前端转图片预览不可下载

    使用场景及原因 实际业务中,一些说明书或协议仅支持用户在线预览,为避免用户自行下载,并进行修改,引发纠纷,特将文件已文件流的形式,传给前端并转为图片显示,此时可能会有人问,为什么不直接在后端转图片,前 ...

  7. 纯前端下载pdf链接文件,而不是打开预览的解决方案

    纯前端下载pdf链接文件,而不是打开预览的解决方案 一,介绍与需求 1.1,介绍 XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...

  8. js实现前端下载文件

    在前端下载文本格式的文件时,可采用下面的方式: (1)创建基于文件内容的Blob对象: (2)通过URL上的createObjectURL方法,将blob对象转换成一个能被浏览器解析的文件地址. (3 ...

  9. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  10. js实现使用文件流下载csv文件

    1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...

随机推荐

  1. 分布式协议与算法-Raft算法

    本文总结自:极客时间韩健老师的分布式协议与算法实战课程. 大家都知道,Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制.关于Paxos算法,博主 ...

  2. 论文翻译:2022_2022_TEA-PSE 2.0:Sub-Band Network For Real-Time Personalized Speech Enhancement

    论文地址:TEA-PSE 2.0:用于实时个性化语音增强的子带网络 论文代码: 引用: 摘要 个性化语音增强(Personalized speech enhancement,PSE)利用额外的线索,如 ...

  3. 0基础搭建基于OpenAI的ChatGPT钉钉聊天机器人

    前言:以下文章来源于我去年写的个人公众号.最近chatgpt又开始流行,顺便把原文内容发到博客园上遛一遛. 注意事项和指引: 注册openai账号,需要有梯子进行访问,最好是欧美国家的IP,亚洲国家容 ...

  4. APP测试注意点-安装卸载与运行

    1.安装和卸载 应用在不同系统版本的ios和android是否可以正常安装(适配问题) 安装过程中是否可以取消 手机存储空间不足时安装应用是否有相应提示信息 安装后的应用是否可以正常卸载 卸载后是否会 ...

  5. springboot输出json日志

    <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-lo ...

  6. Snipaste下载安装(使用教程)

    ## Snipaste下载安装(使用教程)**一 简单介绍** Snipaste 是一个免费简单但强大的截图工具,也可以让你将截图贴回到屏幕上!下载并打开 Snipaste,按下 F1 来开始截图,再 ...

  7. React中组件之间是如何通信的 react的组件通信方式有哪些

    一.是什么 通信指的是发送者通过某种媒体 以某种格式来传递信息 到收信者以达到某个目的,广义上,任何信息的传递都是通信 二.如何通信? 组件传递的方式有很多种,根据传送者和接收者可以分为如下: 父组件 ...

  8. TypeScript 学习笔记 — 类的基本用法(五)

    目录 TS 中定义类 类中实例属性.方法 + 修饰符 public protected private readonly 实例方法 类中原型属性.方法 + 访问器 原型属性 + 访问器 原型方法 类中 ...

  9. JZOJ 4216.平方和

    \(\text{Problem}\) 维护一个序列 支持插入一个数,区间加,询问区间平方和 \(\text{Solution}\) 平衡树很模板的题了 考场打 \(fhq-treap\) 毫无悬念过了 ...

  10. Android Studio 模拟器(AVD)访问本机服务器

    问题说明 若安卓模拟器(AVD)调试安卓 App,访问本机上的 Tomcat 服务器时,很有可能会不成功,按照下面的步骤来一遍以尝试解决问题. 模拟器配置 DNS 服务器 (一)找到模拟器安装的位置 ...