前端下载的方式总结(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对象及它的 ...
随机推荐
- 浪 - Java
如果你的计算机还没有安装 Java, 这篇说明很适合你. OpenJDK 下载地址 历史版本归档 环境配置 cd ~/.local wget https://download.java.net/jav ...
- SQL优化的一些方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 2023计算机领域顶会(A类)以及ACL 2023自然语言处理(NLP)研究子方向领域汇总
2023年的计算语言学协会年会(ACL 2023)共包含26个领域,代表着当前前计算语言学和自然语言处理研究的不同方面.每个领域都有一组相关联的关键字来描述其潜在的子领域, 这些子领域并非排他性的,它 ...
- 调用HttpClient.PostAsync时传token等值
做内部接口转发时加token验证需要传token值过去,有如下两种方式 string jsonContent = JsonConvert.SerializeObject(args); using(va ...
- 栈——stack的用法
介绍 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到 ...
- centos7中配置vnc服务多用户
我用的本地yum源. 注意: 在配置root用户时,设置vnc密码.vncpasswd 添加普通用户时,要先在root用户下添加普通用户(如:vnc1,vnc2) useradd vnc1 passw ...
- 【Go并发编程】Goroutine的基本使用
goroutine是什么 goroutine即协程,使用go关键字开启一个协程异步执行代码. 注意,main函数也是个goroutine. 基本使用 使用go执行子任务,会交替执行(和时间片一样). ...
- LG P3809 【模板】后缀排序
贴模板 注意:\(\text{id}\) 表示第二关键字排序后(其实无需排序,利用上轮的 \(\text{sa}\) 值即可)相应的第一关键字的位置 计数排序为了稳定性最后确定位置时要倒着开始 复制的 ...
- 在线工具帮助医生在社区转诊时甄别SpA患者
在线工具帮助医生在社区转诊时甄别SpA患者 Habibi S, et al. Rheumatology 2016. Present ID: 202. 背景:目前已开发了多种转诊策略以优化脊柱关节炎(S ...
- 重新配置 Idea Webapp 部署
一般 Idea 创建一个 Webapp 时已经自动配置好了,但难免出现意想不到的意外,例如,访问资源 404,编译之后没有把 jsp 页面部署进去等问题. 1️⃣第一步,配置 Project Sett ...