Base64 和 File、Blob 相互转换


前言

简单介绍一下 Base64 和 File、Blob 对象,及三者之间如何相互转换。


一、概念

  1. Base64

对于一个典型的 Base64 数据 URL,它的格式如下:

data:[<mediatype>][;base64],<data>
# 例如
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...

Base64 编码在网络上的一个常见应用是对二进制数据进行编码。解码和编码 Base64 字符串:

  • btoa():从二进制数据“字符串”创建一个 Base-64 编码的 ASCII 字符串(“btoa”应读作“binary to
    ASCII”)
  • atob():解码通过 Base-64 编码的字符串数据(“atob”应读作“ASCII to binary”)
  1. Blob

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,从 Blob 中读取内容的方法是使用 FileReader。Blob 对象通常在服务端响应文件流时,前端设置请求头 responseType: ‘blob’,可将响应转换成 Blob,一个 Blob 对象示例如下:

Blob对象

  1. File

File 继承自 Blob,File 对象是 Blob 对象的一个特殊版本,带有一些额外的属性,如 name 和 lastModified。通常文件上传组件如 el-upload 上传成功时得到的是 File 对象,一个 File 对象示例如下:

File对象

二、相互转换的工具函数

1. Base64 转 File

export const base64ToFile = (base64, mime, filename) => {
  let arr = base64.split(',')
  let type = mime || arr[0].match(/:(.*?);/)[1]
  let suffix = mine.split('/')[1]
  let fileName = filename || `未命名.${suffix}`
  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, { type })
}
  • 正则表达式 /: (.*?);/ 用于匹配以冒号 : 开始,后面跟着任意数量的非分号字符 [^;]*,并以分号 ; 结束的字符串。以上方示例的 base64 字符串为例,会匹配 image/png 部分,即 MIME 类型。
  • atob 函数解码 base64 编码的字符串后,你会得到一个二进制字符串,即每个字符代表一个字节(8位)的原始二进制数据。
  • new Uint8Array(n); // 创建初始化为 0 的,包含 n 个元素的 8 位无符号整型数组。

2. File 转 Base64

function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

fileToBase64 函数时,由于它返回一个 Promise,你需要使用 .then() 或 async/await 来处理结果

3. Base64 转 Blob

转换 Blob 和 File 基本相同,因为 File 就是特殊的 Blob

export const base64ToBlob = (dataurl) => {
  let arr = dataurl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new Blob([u8arr], { type: mime })
}

4. Blob 转 Base64

function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = () => {
      resolve(reader.result);
    };
    reader.onerror = (e) => {
      reject(e);
    };
  });
}
  1. Blob 和 File 相互转换
const file = new File([/* data */], "filename.txt", { type: "text/plain" });
const blob = new Blob([file]);

const blob = new Blob([/* data */], { type: "text/plain" });
const file = new File([blob], "filename.txt", { type: blob.type, lastModified: Date.now() });
JavaScript中的BlobFileBase64都是处理文件或数据的常用对象。下面将介绍它们的使用场景以及相互之间的转换Blob对象用于表示不能被修改的类文件数据,并且可以在被发送到服务器之前进行处理。它可用于在网页上生成下载文件,比如将网页上的图片存储为Blob对象,然后使用URL.createObjectURL()方法将其显示为图像。此外,Blob对象也可以用于通过XMLHttpRequest或Fetch API将数据发送到服务器。 File对象继承自Blob对象,它是用户在表单中选择的文件的表示形式。File对象可以包含文件的名称、大小、类型以及最后修改日期等信息。在上传文件时,我们通常会使用File对象来获取文件的详细信息并进行验证。 Base64是一种将二进制数据编码为ASCII字符的方式,常用于在文本传输中表示二进制数据。我们可以使用JavaScript的btoa()atob()函数在Base64字符串二进制数据之间进行相互转换。 在相互转换方面,可以将Blob对象转换Base64字符串,然后使用toDataURL()方法将其转换为DataURL,或者使用FileReader对象的readAsDataURL()方法将BlobFile对象转换为DataURL。而将Base64字符串转换Blob对象,则可以使用Blob构造函数并设置正确的MIME类型。 综上所述,Blob对象适用于处理类文件数据发送到服务器,File对象适用于处理用户上传的文件,而Base64适用于在文本传输中表示二进制数据。根据具体的应用场景需求,我们可以进行这三种对象之间的相互转换
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值