将ArrayBuffer和base64转为blob临时地址

12288次阅读 761人点赞 作者: WuBin 发布时间: 2021-12-31 14:26:25
扫码到手机查看

base64转换为blob

可以参考我之前的一篇文章:《url、base64、blob相互转换方法》

本页案例通用这个base64图片:

var base64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJGQkY4Qzg1NjlERjExRUM5REQwQzc1NDFCRDg3ODI1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjJGQkY4Qzg2NjlERjExRUM5REQwQzc1NDFCRDg3ODI1Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkZCRjhDODM2OURGMTFFQzlERDBDNzU0MUJEODc4MjUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkZCRjhDODQ2OURGMTFFQzlERDBDNzU0MUJEODc4MjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6lJhElAAAANklEQVR42mL8//8/AzJgZGQECwDFGZHFmRiIBEQrZAFa1YBNAl0c5I7/xJjIOHCeob5CgAADABOSEBPQpeufAAAAAElFTkSuQmCC';

将base64转换为blob的方法(blob是可以提交到后台的,后台可以接收并处理):

//将base64转换为blob对象 解决低版本浏览器兼容问题
function dataURLtoBlob(dataurl) {
     var arr = dataurl.split(',');
      //注意base64的最后面中括号和引号是不转译的   
      var _arr = arr[1].substring(0,arr[1].length-2);
      var mime = arr[0].match(/:(.*?);/)[1],
          bstr =atob(_arr),
          n = bstr.length,
          u8arr = new Uint8Array(n);
      while (n--) {
          u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], {
          type: mime
      });
}

其中Uint8Array()有polyfill,我就直接引用了地址:原github的地址点击查看 或者看我本地的代码:http://code.wubin.work/code/js/base64-arraybuffer-blob/typedarray.js

需要注意的是原作者规定了数组最大长度是 1e5(10000),如果你的数组比这个还大,需要手动改一下源代码 MAX_ARRAY_LENGTH 的值。但作者之所以设了这么一个最大值,是因为在低版本浏览器里用 Array 来模拟 BufferArray 的话是有性能问题的,所以慎重使用。

进行转换

// 直接将blob转化为blob链接
let blob = dataURLtoBlob(base64); 
// 从blob对象中创建url
let src_blob1 = URL.createObjectURL(blob);
console.log('blob对象直接创建的src', src_blob1);

点击查看:http://code.wubin.work/code/js/base64-arraybuffer-blob/

将Blob对象转换为file

// 直接将blob转化为blob链接
let blob = dataURLtoBlob(base64); 
// 创建一个文件 转化为blob链接
let file1 = new File([blob], 'blob', {
     type: 'image/png'
});
let src1 = URL.createObjectURL(file1);
console.log('通过file对象创建的src', src1);

点击查看:http://code.wubin.work/code/js/base64-arraybuffer-blob/

将base64转为ArrayBuffer再转为blob

将base64转为二进制的arrayBuffer,然后再将arrayBuffer二进制转换为blob(同时也是arrayBuffer转为blob临时路径的方法)

首先是两个工具方法:

function b64ToUint6 (nChr) {
  return nChr > 64 && nChr < 91 ?
      nChr - 65
    : nChr > 96 && nChr < 123 ?
      nChr - 71
    : nChr > 47 && nChr < 58 ?
      nChr + 4
    : nChr === 43 ?
      62
    : nChr === 47 ?
      63
    :
      0;
}

// 将base64转换为二进制arraybuffer
// 注意传入的base64前面不能有data:image/png;base64之类 要去掉
function base64DecToArr (sBase64, nBlockSize) {

  var
    sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length,
    nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2, aBytes = new Uint8Array(nOutLen);

  for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
    nMod4 = nInIdx & 3;
    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
    if (nMod4 === 3 || nInLen - nInIdx === 1) {
      for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
        aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
      }
      nUint24 = 0;
    }
  }

  return aBytes;
}

更多的utf8、utf16转换base64和编码解码,可以参考该MDN页面 以上方法就来源于此页面。

转换的操作:

// 将base64转化为arrayBuffer 先去掉前面的data:等
let base64_buffer = base64.split(',')[1];
let arrayBuffer = base64DecToArr(base64_buffer); 
// 这里获取二进制用于转换的arrayBuffer 需要获取.buffer
console.log('arrayBuffer对象', arrayBuffer, arrayBuffer.buffer);
// 二进制转化为blob
let file2 = new File([arrayBuffer.buffer], 'arraybuffer', {
         type: 'image/png'
});
 // 浏览器允许使用URL.createObjectURL()方法,针对 Blob 对象生成一个临时 URL
let src2 = URL.createObjectURL(file2);
console.log('base65->arraybuffer->file对象', src2);

点击查看:http://code.wubin.work/code/js/base64-arraybuffer-blob/

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:base64,arrayBuffer
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9119次阅读 589人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3884次阅读 289人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14139次阅读 919人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12947次阅读 445人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11539次阅读 926人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15646次阅读 1248人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14843次阅读 1209人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29040次阅读 2281人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25064次阅读 1931人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录