前端文件下载 之 ArrayBuffer && Blob && base64 && 文件地址

整个下载思想围绕着将拿到的数据转成blob对象后下载!

arraybuffer转blob很方便,作为参数传入就行了。

var buffer = new ArrayBuffer(16)
var blob = new Blob([buffer])

blob转arraybuffer 此处需要借助fileReader对象:

var blob = new Blob([1,2,3,4,5])
var reader = new FileReader()
 
reader.onload = function() {
    console.log(this.result)
}
reader.readAsArrayBuffer(blob)

请求后端下载(假如设置的是 responseType: ‘arraybuffer’)

let a = document.createElement('a');
 ArrayBuffer 转为 Blob
 let blob = new Blob([response.data], {type: "application/vnd.ms-excel"}); 
 let objectUrl = URL.createObjectURL(blob);
 a.setAttribute("href",objectUrl);
 a.setAttribute("download", '计划单电子表格.xls');
 a.click();

备注:如果 responseType: ‘blob’,那么就直接 URL.createObjectURL(blob)后下载

返回文件地址下载(该方法只能是同源且不需要授权),否则建议应在原本的http请求插件的基础上封装且带上token去请求该文件

download(url) {
	var xhr = new XMLHttpRequest();
	xhr.open("GET", url);
	xhr.responseType = "blob";
	xhr.onload = function() {
		let a = document.createElement("a");
		let objectUrl = URL.createObjectURL(xhr.response);
		a.setAttribute("href", objectUrl);
		a.setAttribute("download", "aa.jpg");
		a.click();
	};
	xhr.onerror = function() {
		console.error("could not download file");
	};
	xhr.send();
}

后端返回 base64 ,处理思想基于FileSaver.js ,有这里可以推测出, xhr.open(‘GET’, base64Url) 不但能放base64Url地址,还能放blob地址,事实上,blob地址是一个存在浏览器中的一个引用地址,该地址存着文件数据,该文件数据与base664数据应该一致或者相似?(猜测~~)

function download (base64Url) {
	var xhr = new XMLHttpRequest()
	xhr.open('GET', base64Url)
	xhr.responseType = 'blob'
	xhr.onload = function () {
		// 此处就能拿到blob对象进行下载处理
	}
	xhr.onerror = function () {
		console.error('could not download file')
	}
	xhr.send()
}

扩展
1:关于responseType,这个是设置给浏览器来解析后端返回的数据格式的,并不是告诉后端要返回什么数据格式,假设说后端返回的是json,那么不管responseType设置成什么都是json,只是会导致解析错误,如果是下载文件那么文件将损坏。
2:能使用xhr.open(‘GET’,url )直接下载的url可以直接放在浏览器地址栏上试试后端返回base64数据是否正确

base64常用前缀:
.doc——data:application/msword;base64,
.docx——data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,
.xls——data:application/vnd.ms-excel;base64,
.xlsx——data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,
.pdf——data:application/pdf;base64,
.ppt——data:application/vnd.ms-powerpoint;base64,
.pptx——data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,
.txt——data:text/plain;base64,
.png——data:image/png;base64,
.jpg——data:image/jpeg;base64,
.gif——data:image/gif;base64,
.svg——data:image/svg+xml;base64,
.ico——data:image/x-icon;base64,
.bmp——data:image/bmp;base64,

n:文件下载神级插件 FileSaver.js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值