一文彻底搞懂前端文件

1.前言

在前端开发中,BlobArrayBufferBufferFileBase64 都是处理二进制数据的不同方式,它们各自有不同的用途和特点。

2.基本介绍

2.1 Blob

Blob 是 Binary Large Object 的缩写,表示一个不可变的、原始数据的类文件对象。Blob 对象可以用来表示文件(如图片、音频、视频等),也可以用来表示其他类型的不可修改的二进制文件。

const blob = new Blob(["Hello, world!"], { type: "text/plain" });
console.log(blob);

在这里插入图片描述

2.2 File

File 对象是 Blob 对象的子类,通常用于表示用户通过 <input type="file">选择的文件。

const file = new File(["Hello, world!"], "hello.txt", { type: "text/plain" });
console.log(file);

在这里插入图片描述

2.3 Buffer

Buffer 是 Node.js 中用于处理二进制数据的对象。它是 Node.js 特有的,不是 JavaScript 标准的一部分。Buffer 类是 Uint8Array 的子类,提供了更丰富的 API 来处理二进制数据。

它类似于 ArrayBuffer,但主要用于服务器端。它能够高效地处理二进制数据,避免了频繁的内存分配和垃圾回收。

用于处理文件 I/O、网络 I/O 等需要高效处理二进制数据的场景

  const buffer = Buffer.from("Hello, world!");

2.4 ArrayBuffer

ArrayBuffer 是一种通用的、固定长度的二进制数据缓冲区。

它不能直接操作,而是需要通过 TypedArray 或 DataView 来读写。

ArrayBuffer与Bolb的关系:

  • ArrayBuffer是底层二进制数据,可以借助工具进行读写,而 Blob是对底层二进制数据的封装 ,我们拿到的就是一个整体,能够读取他的大小,类型,但是不能看到细节。
  • Blob可以接受一个ArrayBuffer作为参数生成一个Blob对象,此行为就相当于对ArrayBuffer数据做一个封装,之后就是以整体的形式展现了-Blob作为一个整体文件,适合用于传输;而只有需要关注细节(比如要修改某一段数据时),才需要用到ArrayBuffer
const buffer = new ArrayBuffer(8); // 创建一个8字节的缓冲区
const view = new Uint8Array(buffer); // 使用Uint8Array来读写缓冲区

2.5 Base64

Base64是一种基于64个可打印字符来表示二进制数据的方法。它通常用于在文本协议中传输二进制数据,如在 HTML 中嵌入图片。

 const base64String = btoa("Hello, world!"); // 将字符串转换为Base64
 console.log(base64String);
 const originalString = atob(base64String); // 将Base64转换回字符串
 console.log(originalString);

在这里插入图片描述

2.6 FileReader

通过fileReader可以将Blob、File读取为不同的格式

  • FileReader.readAsDataURL(blob) 将二进制数据读取并编码为Base64格式
  • FileReader.readAsText(blob) 就是将二进制数据读取并编码为字符串形式

2.7 FormData

使用FormData我们可以异步上传一个二进制文件,而这个二进制文件,就是我们上面讲的Blob对象。

3.场景选择

3.1 文件上传和下载

场景:

  • 用户上传文件到服务器。
  • 从服务器下载文件到本地。

推荐使用:

  • Blob: 用于表示文件对象,适合用于文件上传和下载。
  • ArrayBuffer: 用于处理文件的二进制数据,适合在文件上传前进行预处理(如压缩、加密等)。
  • Base64: 用于在 HTML 中嵌入文件(如图片),或者在 AJAX 请求中传输文件数据

3.2 图片处理

场景:

  • 在网页中显示图片。
  • 对图片进行压缩、裁剪等操作。

推荐使用:

  • Blob: 用于表示图片文件,适合用于文件上传和下载。
  • ArrayBuffer: 用于处理图片的二进制数据,适合在图片处理库中使用。
  • Base64: 用于在 HTML 中嵌入图片,或者在 AJAX 请求中传输图片数据。

3.3 音频和视频处理

场景:

  • 播放音频和视频文件。
  • 对音频和视频进行处理(如剪辑、转码等)。

推荐使用:

  • Blob: 用于表示音频和视频文件,适合用于文件上传和下载。
  • ArrayBuffer: 用于处理音频和视频的二进制数据,适合在音频和视频处理库中使用。
  • Base64: 用于在 HTML 中嵌入音频和视频,或者在 AJAX 请求中传输音频和视频数据。

3.4 数据传输

场景:

  • 通过 AJAX 请求传输二进制数据。
  • 通过 WebSocket 传输二进制数据。

推荐使用:

  • ArrayBuffer: 用于传输二进制数据,适合在 AJAX 和 WebSocket 中使用。
  • Base64: 用于在文本协议中传输二进制数据,适合在 AJAX 请求中传输文件数据。

3.5 数据存储

场景:

  • 在浏览器中存储二进制数据(如使用 IndexedDB)。
  • 在服务器端存储二进制数据(如使用数据库)。

推荐使用:

  • ArrayBuffer: 用于存储二进制数据,适合在 IndexedDB 和数据库中使用。
  • Base64: 用于在文本协议中存储二进制数据,适合在数据库中存储文件数据。

3.6 总结

  • Blob: 适合用于表示文件对象,适合文件上传和下载。
  • ArrayBuffer: 适合用于处理二进制数据,适合在文件处理、音频视频处理、数据传输和存储中使用。
  • Base64: 适合用于在文本协议中传输和存储二进制数据,适合在 HTML 中嵌入文件和在 AJAX 请求中传输文件数据。

4.转换方式

File转Blob

let aBlob = new Blob([file], {type: file.type})

Blob转File

let files = new window.File([this.blob], file.name, {type: file.type})

Blob 转 ArrayBuffer

const blob = new Blob(["Hello, world!"], { type: "text/plain" });
const reader = new FileReader();
reader.onload = function(event) {
    const arrayBuffer = event.target.result;
    console.log(arrayBuffer);
};
reader.readAsArrayBuffer(blob);

ArrayBuffer 转 Blob

const buffer = new ArrayBuffer(8);
const blob = new Blob([buffer], { type: "application/octet-stream" });

Blob 转 Base64

const blob = new Blob(["Hello, world!"], { type: "text/plain" });
const reader = new FileReader();
reader.onload = function(event) {
    const base64String = event.target.result;
    console.log(base64String);
};
reader.readAsDataURL(blob);

Base64 转 Blob

const base64String = "data:text/plain;base64,SGVsbG8sIHdvcmxkIQ==";
const byteCharacters = atob(base64String.split(',')[1]);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: "text/plain" });

ArrayBuffer 转 Base64

const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);
const base64String = btoa(String.fromCharCode.apply(null, view));

Base64 转 ArrayBuffer

const base64String = "SGVsbG8sIHdvcmxkIQ==";
const byteCharacters = atob(base64String);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const buffer = byteArray.buffer;

图片URL转base64

img2base64(imgUrl) {
  let image = new Image()
  image.src = imgUrl
  return new Promise((resolve) => {
    image.onload = () => {
      let canvas = document.createElement('canvas')
      canvas.width = image.width
      canvas.height = image.height
      var context = canvas.getContext('2d')
      context.drawImage(image, 0, 0, image.width, image.height)
      let dataUrl = canvas.toDataURL('image/png')
      resolve(dataUrl)
    }
  })
}
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值