Skip to content

Commit 4259e67

Browse files
committed
docs(bom): edit blob
1 parent 8727260 commit 4259e67

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

docs/bom/arraybuffer.md

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ var buf2 = buf1.slice(0);
3232

3333
## Blob 对象
3434

35-
Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件。它与 ArrayBuffer 的区别在于,它用于操作二进制文件,而 ArrayBuffer 用于操作内存。
35+
### 简介
36+
37+
Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件,它的名字是 Binary Large Object (二进制大型对象)的缩写。它与 ArrayBuffer 的区别在于,它用于操作二进制文件,而 ArrayBuffer 用于操作内存。
3638

3739
浏览器原生提供`Blob()`构造函数,用来生成实例对象。
3840

@@ -56,6 +58,8 @@ var obj = { hello: 'world' };
5658
var blob = new Blob([ JSON.stringify(obj) ], {type : 'application/json'});
5759
```
5860

61+
### 实例属性和实例方法
62+
5963
`Blob`具有两个实例属性`size``type`,分别返回数据的大小和类型。
6064

6165
```javascript
@@ -74,3 +78,73 @@ myBlob.slice(start,end, contentType)
7478

7579
`slice`方法有三个参数,都是可选的。它们依次是起始的字节位置(默认为0)、结束的字节位置(默认为`size`属性的值,该位置本身将不包含在拷贝的数据之中)、新实例的数据类型(默认为空字符串)。
7680

81+
### 读取文件
82+
83+
文件选择器`<input type="file">`用来让用户选取文件。出于安全考虑,浏览器不允许脚本自行设置这个控件的`value`属性,即文件必须是用户手动选取的,不能是脚本指定的。一旦用户选好了文件,脚本就可以读取这个文件。
84+
85+
文件选择器返回一个 FileList 对象,该对象是一个类似数组的成员,每个成员都是一个 File 实例对象。File 实例对象是一个特殊的 Blob 实例,增加了`name``lastModifiedDate`属性。
86+
87+
```javascript
88+
// HTML 代码如下
89+
// <input type="file" accept="image/*" multiple onchange="fileinfo(this.files)"/>
90+
91+
function fileinfo(files) {
92+
for (var i = 0; i < files.length; i++) {
93+
var f = files[i];
94+
console.log(
95+
f.name, // 文件名,不含路径
96+
f.size, // 文件大小,Blob 实例属性
97+
f.type, // 文件类型,Blob 实例属性
98+
f.lastModifiedDate // 文件的最后修改时间
99+
);
100+
}
101+
}
102+
```
103+
104+
除了文件选择器,拖放 API 的`dataTransfer.files`返回的也是一个FileList 对象,它的成员因此也是 File 实例对象。
105+
106+
### 下载文件
107+
108+
AJAX 请求时,如果指定`responseType`属性为`blob`,下载下来的就是一个 Blob 对象。
109+
110+
```javascript
111+
function getBlob(url, callback) {
112+
var xhr = new XMLHttpRequest();
113+
xhr.open('GET', url);
114+
xhr.responseType = 'blob';
115+
xhr.onload = function () {
116+
callback(xhr.response);
117+
}
118+
xhr.send(null);
119+
}
120+
```
121+
122+
上面代码中,`xhr.response`拿到的就是一个 Blob 对象。
123+
124+
### 生成 URL
125+
126+
浏览器允许使用`URL.createObjectURL()`方法,针对 Blob 对象生成一个临时 URL,以便于某些 API 使用。这个 URL 以`blob://`开头,表明对应一个 Blob 对象,协议头后面是一个识别符,用来唯一对应内存里面的 Blob 对象。这一点与`data://URL`(URL 包含实际数据)和`file://URL`(本地文件系统里面的文件)都不一样。
127+
128+
```javascript
129+
var droptarget = document.getElementById('droptarget');
130+
131+
droptarget.ondrop = function (e) {
132+
var files = e.dataTransfer.files;
133+
for (var i = 0; i < files.length; i++) {
134+
var type = files[i].type;
135+
if (type.substring(0,6) !== 'image/')
136+
continue;
137+
var img = document.createElement('img');
138+
img.src = URL.createObjectURL(files[i]);
139+
img.onload = function () {
140+
this.width = 100;
141+
document.body.appendChild(this);
142+
URL.revokeObjectURL(this.src);
143+
}
144+
}
145+
}
146+
```
147+
148+
上面代码通过为拖放的图片文件生成一个 URL,产生它们的缩略图,从而使得用户可以预览选择的文件。
149+
150+
浏览器处理 Blob URL 就跟普通的 URL 一样,如果 Blob 对象不存在,返回404状态码;如果跨域请求,返回403状态码。Blob URL 之对 GET 请求有效,如果请求成功,返回200状态码。由于 Blob URL 就是普通 URL,因此可以下载。

0 commit comments

Comments
 (0)