base64,file,Blob和ArrayBuffer以及src之间的转换

本文部分内容因为不想手写所以借鉴了博客,如有需要请移步

一、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 });
}

二、Blob/file 转为base64
参数:blob或file
function blobToDataURL(blob, callback) {
    let a = new FileReader();
    a.onload = function (e) { callback(e.target.result); }
    a.readAsDataURL(blob);
}

本人建议使用promise来完成,暂只有一个例子,其余方法也可使用promise的方式去完成:

new Promise((resolve, reject) => {
        const fileReader = new FileReader();
        fileReader.onload = (e) => {
          resolve(e.target.result);
        };
        // readAsDataURL
        fileReader.readAsDataURL(blob);
        fileReader.onerror = () => {
          reject(new Error("blobToBase64 error"));
        };
      }).then((res) => {
        // 转化后的base64
        console.log("base64", res);
        this.logoSrc = res;
      });
三、base64转换为file
function dataURLtoFile(dataurl, filename) {//将base64转换为文件
        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 File([u8arr], filename, {type:mime});
}
四、图片转换为base64
function getImgToBase64(url,callback){//将图片转换为Base64
  var canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d'),
    img = new Image;
  img.crossOrigin = 'Anonymous';
  img.onload = function(){
    canvas.height = img.height;
    canvas.width = img.width;
    ctx.drawImage(img,0,0);
    var dataURL = canvas.toDataURL('image/png');
    callback(dataURL);
    canvas = null;
  };
  img.src = url;
}

五、arrayBuffer转Base64

function arrayBufferToBase64(buffer) {
        var binary = "";
        var bytes = new Uint8Array(buffer);
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
          binary += String.fromCharCode(bytes[i]);
        }
        return window.btoa(binary);
      }

六、file转src

let src = URL.createObjectURL(file);

七、arrayBuffer转file

第一个参数是一个可能为ArrayBufferArrayBufferViewBlob或者DOMString对象的数组,第二个参数表示文件名称.

let file = new File(arrayBuffer,fileName);

八、file转arrayBuffer

FileReader的实例方法readAsArrayBuffer可以读取指定的 Blob 或 File 内容,在文件读取完毕后会触发 loadend 事件,我们可以在回调里面拿到读取后的arrayBuffer

function fileToBuffer(file, callback){
    let fr = new FileReader();
    let filename = file.name;

    fr.readAsArrayBuffer(file);
    fr.addEventListener("loadend",(e) => {
        let buf = e.target.result;
        callback(buf, filename);
    },false);
}

九、arrayBuffer转Blob

第一个参数是一个由 ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的数组,
第二个参数是Blob对象的type 属性,默认值为 “”,它代表了将会被放入到blob中的数组内容的MIME类型

let blob = new Blob([buf], { type: mimeType });

十、Blob转arrayBuffer

FileReader的实例方法readAsArrayBuffer除了读取file外还可以读取blob,所以使用方法和第八条一样,只是参数变成了blob.

function blobToBuffer(file, callback){
    let fr = new FileReader();
    let filename = file.name;

    fr.readAsArrayBuffer(blob);
    fr.addEventListener("loadend",(e) => {
        let buf = e.target.result;
        callback(buf, filename);
    },false);
}

十一、Blob转File

Blob转file我们可以借助FormData来实现,FormData能容纳的数据类型有三种分别是blobfilestring,我们可以将blob存入FormData对象,然后我们根据存入时的键名取值就能得到file文件。

const transformBlobToFile = (blob) => {
    // let file = await new Window.File([blob], `${new Date().getTime()}.jpg`);
    const fd = new FormData();
    let tempArr = imagePath.split("\\");
    fd.set("foo", blob, tempArr[tempArr.length - 1]);
    let file = fd.get("foo");
    setChooseFile(file);
  };

其实我们还可以借用window.File对象去生成file文件,但是注意在electron中使用时会有拿不到现象。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值