前端下载的方式总结(url,文件流,压缩包)
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.download(window.download是假想)。
3、文件流下载,通过接口下载
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,文件流,压缩包)的更多相关文章
- .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...
- Java浏览器弹出下载框,多个文件导出压缩包
项目里一直有这个功能,也一直没怎么注意,今天研究了一下 依据逻辑往下走: 首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管: Map<String, Object> ...
- fetch的文件流下载及下载进度获取
下载过程中,获取进度,fetch API并没有提供类似xhr和ajax的 progress所以用 getReader()来循环读取大小 let size = 0; fetch( URL() + `/s ...
- js 前端实现文件流下载的几种方式
后端是用Java写的一个下载的接口,返回的是文件流,需求:点击,请求,下载 利用iframe实现文件流下载 //把上一次创建的iframe删掉,不然随着下载次数的增多页面上会一堆的iframe var ...
- web api 如何通过接收文件流的方式,接收客户端及前端上传的文件
服务端接收文件流代码: public async Task<HttpResponseMessage> ReceiveFileByStream() { var stream = HttpCo ...
- Vue.js +pdf.js 处理响应pdf文件流数据,前端转图片预览不可下载
使用场景及原因 实际业务中,一些说明书或协议仅支持用户在线预览,为避免用户自行下载,并进行修改,引发纠纷,特将文件已文件流的形式,传给前端并转为图片显示,此时可能会有人问,为什么不直接在后端转图片,前 ...
- 纯前端下载pdf链接文件,而不是打开预览的解决方案
纯前端下载pdf链接文件,而不是打开预览的解决方案 一,介绍与需求 1.1,介绍 XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...
- js实现前端下载文件
在前端下载文本格式的文件时,可采用下面的方式: (1)创建基于文件内容的Blob对象: (2)通过URL上的createObjectURL方法,将blob对象转换成一个能被浏览器解析的文件地址. (3 ...
- 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有相关 ...
- js实现使用文件流下载csv文件
1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...
随机推荐
- vscode快速删除空白行方法
1.快速打开替换界面,在Find界面输入^\s*(?=\r?$)\n 2.Alt+R选择Use Regular Expression(Alt+R)即正则表达式模式: 3.选择Replace All(C ...
- Java入门与进阶P-3.7+P-3.8
猜数游戏 让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它这是大了还是小了,知道用户猜中为止,最后还要告诉用户它猜了多少次 因为需要不断重复让用户猜,所以需要用到循环 在实际写出程序之前 ...
- Docker+nginx部署前后端分离项目
1.下载Docker和Docker-Compose 1.安装Docker 记一次踩坑:误装podman-docker 问题概述:Centos8去下载Docker时,默认装的是podman-docker ...
- 读Java8函数式编程笔记01_Lambda表达式
1. Java 8函数式编程 1.1. 没有单子 1.2. 没有语言层面的惰性求值 1.3. 没有为不可变性提供额外支持 1.4. 集合类可以拥有一些额外的方法:default方法 2. 现实世界中, ...
- 网络编程前戏和OSI七层协议
目录 一.软件开发架构 1.什么是软件开发架构 2.软件开发架构 架构方式一:c/s架构 架构方式二:b/s架构 架构优劣势 二.架构总结 三.网络编程前戏 1.什么是网络编程 2.学习网络编程的目的 ...
- 简述 Gin 框架如何集成swagger
https://blog.csdn.net/raogeeg/article/details/86743953 @Title 这个 API 所表达的含义,是一个文本,空格之后的内容全 ...
- vue+element 返回数组或json数据自定义某列显示的处理--两种方法
本文是作者开发一个业务需求时,将返回数据列表的其中一个数据长度很长的字段处理成数组,并将其作为子表显示的过程,具体样式如下(数据做了马赛克处理) 返回的过长字段数据处理(用分号分隔的一个长字段): t ...
- STM32F0_HAL初始化系列:输入捕捉
1.使用的TIM1,配置如下: 2.代码: int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Ini ...
- Vue3 中的组件 provide和inject 传值、获取组件实例的方法getCurrentInstance()
一. provide和inject(依赖注入) 1:在父级组件中提供数据 语法:provide('提供给子组件的变量名',提供给子组件的数据) 2: 在子级组件中获取收据 ...
- git 合并dev分支到 master分支 (merge)
## 查看分支列表 $ git branch -a ## 切换到本地dev分支 $ git checkout dev ## 更新本地dev 分支 $ git pull ## 切换到master 分支 ...