世界上有两万人会与你一见钟情,但你这辈子可能一个也遇不到,与其说是一见钟情,不如说是命运。
Blob 对象
- Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件,它的名字是 Binary Large Object (二进制大型对象)的缩写。用于操作二进制文件。
Blob 语法
- 浏览器原生提供Blob()构造函数,用来生成实例对象。
- Blob构造函数接受两个参数。第一个参数是数组,成员是字符串或二进制对象,表示新生成的Blob实例对象的内容;第二个参数是可选的,是一个配置对象,目前只有一个属性type,它的值是一个字符串,表示数据的 MIME 类型,默认是空字符串。
1 | var htmlFragment = ['<a id="a"><b id="b">hey!</b></a>']; |
实例属性和实例方法
- size
- 返回数据的大小
- type
- 返回数据的类型
1 | var htmlFragment = ['<a id="a"><b id="b">hey!</b></a>']; |
- slice()
- 用来拷贝原来的数据,返回的也是一个Blob 实例。
1 | myBlob.slice(start, end, contentType) |
- slice方法有三个参数,都是可选的。它们依次是起始的字节位置(默认为0)、结束的字节位置(默认为size属性的值,该位置本身将不包含在拷贝的数据之中)、新实例的数据类型(默认为空字符串)。
获取文件信息
文件选择器
<input type="file">
用来让用户选取文件。出于安全考虑,浏览器不允许脚本自行设置这个控件的value属性,即文件必须是用户手动选取的,不能是脚本指定的。一旦用户选好了文件,脚本就可以读取这个文件。文件选择器返回一个 FileList 对象,该对象是一个类似数组的成员,每个成员都是一个 File 实例对象。File 实例对象是一个特殊的 Blob 实例,增加了name和lastModifiedDate属性。
1 | <body> |
下载文件
- AJAX 请求时,如果指定responseType属性为blob,下载下来的就是一个 Blob 对象。
1 | function getBlob(url, callback) { |
- 上面代码中,xhr.response拿到的就是一个 Blob 对象。
生成 URL
- 浏览器允许使用URL.createObjectURL()方法,针对 Blob 对象生成一个临时 URL,以便于某些 API 使用。这个 URL 以blob://开头,表明对应一个 Blob 对象,协议头后面是一个识别符,用来唯一对应内存里面的 Blob 对象。这一点与data://URL(URL 包含实际数据)和file://URL(本地文件系统里面的文件)都不一样。
1 | var droptarget = document.getElementById('droptarget'); |
- 上面代码通过为拖放的图片文件生成一个 URL,产生它们的缩略图,从而使得用户可以预览选择的文件。
浏览器处理 Blob URL 就跟普通的 URL 一样,如果 Blob 对象不存在,返回404状态码;如果跨域请求,返回403状态码。Blob URL 只对 GET 请求有效,如果请求成功,返回200状态码。由于 Blob URL 就是普通 URL,因此可以下载。