您现在的位置:首页 >> 网页设计 >> JavaScript >> 内容

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

时间:2020-5-5 16:54:10

  核心提示:我们通常下载文件的方式无非后端给一个生成文件链接, 前端通过a标签或者iframe的方式去下载,这种方式的弊端是无法监测到文件是否下载完成,无法给用户友好的提示,以避免用户短时间内重复点击下载.如果我...

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

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号