我们通常下载文件的方式无非后端给一个生成文件链接, 前端通过a标签或者iframe的方式去下载,这种方式的弊端是无法监测到文件是否下载完成,无法给用户友好的提示,以避免用户短时间内重复点击下载.
如果我们能用ajax从后端拿到pdf的相关数据,再在前端下载成pdf就可以解决这个问题,那么新的问题是:
1. 前端如何下载pdf?
2. 后端给什么格式的数据?
针对第一个问题很简单:将通过url.createobjecturl()函数将blob对象生成url,并添加到a标签上即可解决.
问题转化成后端给什么格式数据我们通过ajax请求获取之后可以转化成blob? base64是一个可行的方案.
具体解决方案如下:
1. 将base64转化成blob方法
1 function convertbase64toblob(base64, filetype, slice) { 2 return new blob(atob(base64) 3 .match(new regexp(`([\\s\\s]{${slice}})|([\\s\\s]{1,${slice}})`, 'g')) 4 .map(function(item){ 5 return new uint8array(item.split('').map(function(s, i) { 6 return item.charcodeat(i) 7 })) 8 }), {type: filetype}) 9 }
2. 前端下载pdf
1 const blob = convertbase64toblob(data, 'application/pdf', 1024) 2 if (navigator.mssaveblob) { 3 return navigator.mssaveblob(blob, '1.pdf'); 4 } 5 const urlfromblob = window.url.createobjecturl(blob); 6 const a = document.createelement('a'); 7 a.style.display = 'none'; 8 a.href = urlfromblob; 9 a.download = '1.pdf'; 10 document.body.appendchild(a); 11 a.click(); 12 window.url.revokeobjecturl(urlfromblob); 13 document.body.removechild(a)
over !
如对本文有疑问, 点击进行留言回复!!
Parallels Desktop v15.1.4-47270 商业版下载 Mac安装Windows首选虚拟机
关于LPC824Lite开发板下载程序时提示"Invalid ROM Table"
MySQL 5.7 关于 JSON 类型的子集Key/Value获取方法分享
javascript从入门到跑路-----小文的js学习笔记(19)------- js的垃圾回收机制
网友评论