Javascript 如何实现base64转文件下载保存到本地

BytesIO二进制流文件(内存缓存)转json格式传输到前端

加码

#读取二进制序列
io_file = BytesIO()
f.save(io_file)
data = io_file.getvalue()
base64_data = base64.b64encode(data)
#字符串化,使用utf-8的方式解析二进制
base64_str = str(base64_data,'utf-8')

解码

base64_data = base64_str.encode(encoding='utf-8')
data = base64.b64decode(base64_data)

base64转文件下载(方法1)

<script>
  //将base64转换为blob
  function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], { type: mime });
  }
  // * desc: 下载方法
  // * @param url  :返回数据的blob对象或链接
  // * @param fileName  :下载后文件名标记
  function downloadFile(url, name = "What's the fuvk") {
    var a = document.createElement("a");
    a.setAttribute("href", url);
    a.setAttribute("download", name);
    a.setAttribute("target", "_blank");
    let clickEvent = document.createEvent("MouseEvents");
    clickEvent.initEvent("click", true, true);
    a.dispatchEvent(clickEvent);
  }
  // * desc: 下载参数入口
  // * @param base64  :返回数据的blob对象或链接
  // * @param fileName  :下载后文件名标记
  function downloadFileByBase64(base64, fileName) {
    var myBlob = dataURLtoBlob(base64);
    var myUrl = URL.createObjectURL(myBlob);
    downloadFile(myUrl, fileName);
  }
</script>

注意的点:
bytesio转base64的适合记得要带上header,即mimetype类型

因为不同的文件类型base64前面拼接的不同

//根据文件后缀 获取base64前缀不同
 function getBase64Type(type) {
      switch (type) {
        case 'txt': return 'data:text/plain;base64,';
        case 'doc': return 'data:application/msword;base64,';
        case 'docx': return 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,';
        case 'xls': return 'data:application/vnd.ms-excel;base64,';
        case 'xlsx': return 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,';
        case 'pdf': return 'data:application/pdf;base64,';
        case 'pptx': return 'data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,';
        case 'ppt': return 'data:application/vnd.ms-powerpoint;base64,';
        case 'png': return 'data:image/png;base64,';
        case 'jpg': return 'data:image/jpeg;base64,';
        case 'gif': return 'data:image/gif;base64,';
        case 'svg': return 'data:image/svg+xml;base64,';
        case 'ico': return 'data:image/x-icon;base64,';
        case 'bmp': return 'data:image/bmp;base64,';
      }
   
 //附上获取文件后缀的方法  
 function getType(file) {
     var filename = file;
     var index1 = filename.lastIndexOf(".");
     var index2 = filename.length;
     var type = filename.substring(index1 + 1, index2);
     return type;
   },

base64转文件下载(方法2)

// * desc: 下载导出文件
// * @param blob  :返回数据的blob对象或链接
// * @param fileName  :下载后文件名标记
// * @param fileType  :文件类 word(docx) excel(xlsx) ppt等
downloadExportFile(blob, fileName, fileType) {
  const downloadElement = document.createElement('a')
  let href = blob
  if (typeof blob === 'string') {
    downloadElement.target = '_blank'
  } else {
    href = window.URL.createObjectURL(blob) // 创建下载的链接
  }
  downloadElement.href = href
  downloadElement.download = fileName + '.' + fileType // 下载后文件名
  document.body.appendChild(downloadElement)
  downloadElement.click() // 触发点击下载
  document.body.removeChild(downloadElement) // 下载完成移除元素
  if (typeof blob !== 'string') {
    window.URL.revokeObjectURL(href) // 释放掉blob对象
  }
},
// * desc: base64转文件并下载
// * @param base64 {String} : base64数据
// * @param fileType {String} : 要导出的文件类型png,pdf,doc,mp3等
// * @param fileName {String} : 文件名
downloadFile(base64, fileName, fileType) {
  const typeHeader = 'data:application/' + fileType + ';base64,' // 定义base64 头部文件类型
  const converedBase64 = typeHeader + base64 // 拼接最终的base64
  const blob = this.base64ToBlob(converedBase64, fileType) // 转成blob对象
  this.downloadExportFile(blob, fileName, fileType) // 下载文件
}

使用

this.downloadFile('你的base64数据','你的文件名称','你的文件数据类型');

上述方法有一定的问题,base64ToBlob方法是缺失的,可以参考方法1中的如何实现,主要干的事就是把base64的数据加上header,方法1的是在后端实现了,而该方法是在前端js中添加的,只不过方法并没有写,其实就是拼接。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDamogu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值