• 前端通过ajax获取base64转blob下载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 !

    
    
  • 相关阅读:
    产品需求说明书PRD模版
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    luogu P1164 小A点菜
    luogu P1347 排序
    luogu P1195 口袋的天空
    luogu P1182 数列分段Section II
    luogu P1332 血色先锋队
    luogu P1983 车站分级
  • 原文地址:https://www.cnblogs.com/convincee/p/12815161.html
Copyright © 2020-2023  润新知