二进制学习—Blob,ArrayBuffer、File、FileReader和FormData的区别
前言:
- Blob、ArrayBuffer、File、fileReader、formData这些名词总是经常看到,知道一点又好像不知道,像是同一个东西好像又不是,总是模模糊糊,最近终于下决心要弄清楚。
- 为了更好的理解每个名词的意义,本文先用尽量通俗的语言解释下各自的区别,大概能在宏观上区分之后,再会在其他博文中做单个解释。
- 这些名词里,Blob、ArrayBuffer、File可以归为一类,它们都是数据;而fileReader算是一种工具,用来读取数据;formData可以看做是一个应用数据的场景。因此,我们首先着重区分Blob、ArrayBuffer、File,然后再对fileReader和formData做简要介绍。
blob
概念理解
- Blob的全称是binary large object,表示二进制大对象,并不是前端的特有对象,而是计算机界的通用术语,MySql/Oracle数据库中,就有一种Blob类型,专门存放二进制数据。
- MDN中官方的解释是:一个Blob对象就是一个包含有只读原始数据的类文件对象。通俗点,我们可以直接将Blob看做是一个不可修改的二进制文件。
使用
- 构造函数
直接通过new Blob()
就可以创建一个Blob对象
var aBlob = new Blob( array, options );
array(可选):是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体。(暂时可以不用理解,就可以看作是一堆数据)
options(可选):一个对象,用来
设置Blob的一些属性。主要的是一个type属性,表示Blob的类型(其他暂时也不用管)。
简单来说,就是可以通过向new Blob()传一堆数据,生成一个Blob对象
- 属性
Blob.size(只读):Blob对象中包含的数据大小(字节)
Blob.type(只读):表明该Blob对象所包含数据的MIME类型。例如若为图片,此字段就类似为’image/jpeg‘。如果类型未知,则该值为空字符串。
- 方法
Blob只有一个slice方法,实现对文件的分割(注意这里并不违背Blob的只读性,slice只是只是复制指定范围内的Blob数据)。
Blob.slice(start, end ,contentType)
start:开始索引,可以为负数,语法类似于数组的slice方法。默认值为0。
end:结束索引,可以为负数,语法类似于数组的slice方法。默认值为最后一个索引。
contentType:新的Blob对象的MIME类型,这个值将会成为新的Blob对象的type属性的值,默认为一个空字符串。
小结
简单来说,Blob就是一个只读的二进制文件,我们可以知道它的文件大小(size),文件类型(type),并可以对其作出分割(slice)。
file
概念理解
- file根据名字很容易理解,就是纯粹的文件。通常,表示我们使用
<input type="file">
选择的FileList对象,或者是使用拖拽操作搞出的DataTransfer对象。 - file对象也是二进制对象,从属于Blob;也就是说file是Blob里的一个小类,Blob的属性和方法都可以用于file,而file自己也有自己特有的属性和方法。对于Blob和file都有的属性,推荐使用Blob的属性
FormData
准确来说,FormData其实与上述内容关系就不大了。它是XMLHttpRequest Level 2添加的一个新的接口,我们可以通过JavaScript用一些键值对来模拟一系列表单控件。FormData的最大优点就是,比起普通的ajax, 使用FormData我们可以异步上传一个二进制文件,而这个二进制文件,就是我们上面讲的Blob对象。
UR
L.createObjectURL()
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象
语法
objectURL = URL.createObjectURL(object);
参数
-
object
用于创建 URL 的
File
对象、Blob
对象或者MediaSource
对象。
返回值
一个DOMString
包含了一个对象URL,该URL可用于指定源 object
的内容。