前端通过ajax获取base64转blob下载PDF方法
我们通常下载文件的方式无非后端给一个生成文件链接, 前端通过a标签或者iframe的方式去下载,这种方式的弊端是无法监测到文件是否下载完成,无法给用户友好的提示,以避免用户短时间内重复点击下载.
如果我们能用Ajax从后端拿到PDF的相关数据,再在前端下载成PDF就可以解决这个问题,那么新的问题是:
1. 前端如何下载PDF?
2. 后端给什么格式的数据?
针对第一个问题很简单:将通过URL.createObjectURL()函数将blob对象生成url,并添加到a标签上即可解决.
问题转化成后端给什么格式数据我们通过ajax请求获取之后可以转化成blob? base64是一个可行的方案.
具体解决方案如下:
1. 将base64转化成blob方法
function convertBase64ToBlob(base64, fileType, slice) { return new Blob(atob(base64) .match(new RegExp(`([\\s\\S]{${slice}})|([\\s\\S]{1,${slice}})`, ‘g‘)) .map(function(item){ return new Uint8Array(item.split(‘‘).map(function(s, i) { return item.charCodeAt(i) })) }), {type: fileType}) }
2. 前端下载PDF
const blob = convertBase64ToBlob(data, ‘application/pdf‘, 1024) if (navigator.msSaveBlob) { return navigator.msSaveBlob(blob, ‘1.pdf‘); } const urlFromBlob = window.URL.createObjectURL(blob); const a = document.createElement(‘a‘); a.style.display = ‘none‘; a.href = urlFromBlob; a.download = ‘1.pdf‘; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(urlFromBlob); document.body.removeChild(a)
over !