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. 计组Review1

    1GB的内存,它是以字节编址的,假设内存地址为32位,128KB的高速缓存.现在有一个数据位于0x123456(字节编址),会映射到那些不同情形的内存单元上,还有TAG和总缓存大小. 1. 直接映射, ...

  2. 个别编程语言在OJ平台上的输入输出方式

    OJ 平台输入输出 一. C/ C++ 输入 scanf() gets() getchar() 输出 printf() puts() putchar() C++ cin >> cout & ...

  3. Z-Blog后台getshell

    Z-Blog后台getshell 本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负. 0x00 环境部署 文件下载地址 打开phpstudy ...

  4. 读Java8函数式编程笔记06_Lambda表达式编写并发程序

    1. 阻塞式I/O 1.1. 一种通用且易于理解的方式,因为和程序用户的交互通常符合这样一种顺序执行的方式 1.2. 将系统扩展至支持大量用户时,需要和服务器建立大量TCP连接,因此扩展性不是很好 2 ...

  5. 10月25日内容总结——正则表达式相关知识与re模块

    目录 一.正则表达式前戏 二.正则表达式内容介绍 1.字符组 2.特殊符号 3.量词 4.贪婪匹配与非贪婪匹配 贪婪匹配 非贪婪匹配 5.转义符 6.正则表达式实战建议与一些例子 建议 例子 三.re ...

  6. session实现servlet数据共享

    为了满足老师考试要求,要实现数据共享,要实现顾客登录的功能,登录后进行增删改查要对该顾客进行操作,所以需要将该顾客的一些信息共享给其他操作,找了一些资料,来通过session实现: 首先,设置: Ht ...

  7. ctfshow_web入门 sql注入(web171~248)

    sql注入 这是算是学习+做题+记录的一个笔记吧,而且基本都是看着Y4师傅的博客做的 由于是做过sqli靶场,所以这个就记录快点了.如果靶场没遇到的,也会做笔记. union 联合注入 web171 ...

  8. UOJ NOI Round #6

    总结 \(\text{Day1}\) 只打了 \(T1\),想正解无果以致于没时间打暴力 \(\text{T1}\) 考虑到最后一个面基者要么落在点上,要么落在边上 所以可以枚举点和边,统计最久的落在 ...

  9. [TJOI2007]书架

    题目 网上搜 分析 我们可以认为插入一本书是在树中第 \(k\) 的位置进行插入操作 其中 \(k\) 为这本放入书架后的位置 考虑 \(fhq-treap\) 实现 我们将书编号为 \([0,n-1 ...

  10. 记一次 .NET某家装ERP系统 内存暴涨分析

    一:背景 1. 讲故事 前段时间微信上有一位老朋友找到我,说他的程序跑着跑着内存会突然爆高,有时候会下去,有什么会下不去,怀疑是不是某些情况下存在内存泄露,让我帮忙分析一下,其实内存泄露方面的问题还是 ...