欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端通过ajax获取base64转blob下载PDF方法

程序员文章站 2022-05-18 18:08:58
我们通常下载文件的方式无非后端给一个生成文件链接, 前端通过a标签或者iframe的方式去下载,这种方式的弊端是无法监测到文件是否下载完成,无法给用户友好的提示,以避免用户短时间内重复点击下载. 如果我们能用Ajax从后端拿到PDF的相关数据,再在前端下载成PDF就可以解决这个问题,那么新的问题是: ......

我们通常下载文件的方式无非后端给一个生成文件链接, 前端通过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 !