我用一文总结File base64 Blob对象之间切换自如

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

背景

我们在日常码代码中,Blob,file,base64之间的转换肯定用的非常多。今天我就把file base64 blob之间的转换总结下来。

File的定义

HTML5 在 DOM 上为文件输入元素添加了 files 集合。当用户在文件字段中选择一个或多个文件时,这个 files 集合中会包含一组 File 对象,表示被选中的文件。每个 File 对象都有一些只读属性。

File对象是特殊类的Blob,且可以用在任意的 Blob 类型的 context 中。

file转base64

/**
 * @param { * } file 图片文件
 */
export const fileToBase64 = file => {
    let reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function (e) {
        return e.target.result
    };
};

复制代码

Blob的定义

blob 表示二进制大对象(binary larget object),是 JavaScript 对不可修改二进制数据的封装类型。包 含字符串的数组、ArrayBuffers、ArrayBufferViews,甚至其他 Blob 都可以用来创建 blob。

Blob 是什么

var debug = {name: "zz"};
var blob = new Blob([JSON.stringify(debug,null,2)], {type:'application/json'})
复制代码

image.png 我们打印blob可以看到,blob有两个属性:size 和 type 。其中size 属性表示数据的大小(以字节为单位),type 是MIME类型的字符串。

Blob 常用的场景

  • 大文件分片上传
  • 隐藏视频链接
  • 文件下载

blob转file

/**
 *  @param { blob } blob
 *  @param { string } fileName
 */
export const blobToFile = (blob, fileName) => {
    blob.lastModifiedDate = new Date();
    blob.name = fileName;
    return blob;
};

复制代码

base64的定义

Base64 是一组相似的二进制到文本的编码规则,使得二进制数据在解释成 radix-64 的表现形式后能够用 ASCII 字符串的格式表示出来。Base64编码普遍应用于需要通过被设计为处理文本数据的媒介上储存和传输二进制数据而需要编码该二进制数据的场景。

所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

base64转file

/**
 *  @param { base64 } base64
 *  @param { string } filename 转换后的文件名
 */
export const base64ToFile = (base64, filename )=> {
    let arr = base64.split(',');
    let mime = arr[0].match(/:(.*?);/)[1];
    let suffix = mime.split('/')[1] ; 
    let bstr = atob(arr[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], `${filename}.${suffix}`, { type: mime })
};
复制代码

base64转blob

/**
 *  @param { base64 } base64
 */
export const base64ToBlob = base64 => {
    let arr = base64.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 });
};

复制代码

推荐阅读

最后

我是zz,发财的小手,记得一键三连哦!!!

猜你喜欢

转载自juejin.im/post/7017575277102366733