Skip to content

Commit 151d038

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

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

docs/bom/arraybuffer.md

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ myBlob.slice(start,end, contentType)
7878

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

81-
### 读取文件
81+
### 获取文件信息
8282

8383
文件选择器`<input type="file">`用来让用户选取文件。出于安全考虑,浏览器不允许脚本自行设置这个控件的`value`属性,即文件必须是用户手动选取的,不能是脚本指定的。一旦用户选好了文件,脚本就可以读取这个文件。
8484

@@ -148,3 +148,65 @@ droptarget.ondrop = function (e) {
148148
上面代码通过为拖放的图片文件生成一个 URL,产生它们的缩略图,从而使得用户可以预览选择的文件。
149149

150150
浏览器处理 Blob URL 就跟普通的 URL 一样,如果 Blob 对象不存在,返回404状态码;如果跨域请求,返回403状态码。Blob URL 之对 GET 请求有效,如果请求成功,返回200状态码。由于 Blob URL 就是普通 URL,因此可以下载。
151+
152+
## 读取文件
153+
154+
取得 Blob 对象以后,可以通过`FileReader`对象,读取 Blob 对象的内容,即文件内容。
155+
156+
FileReader 对象提供四个方法,处理 Blob 对象。Blob 对象作为参数传入这些方法,然后以指定的格式返回。
157+
158+
- FileReader.readAsText():返回文本,需要指定文本编码,默认为 UTF-8。
159+
- FileReader.readAsArrayBuffer():返回 ArrayBuffer 对象。
160+
- FileReader.readAsDataURL():返回 Data URL。
161+
- FileReader.readAsBinaryString():返回原始的二进制字符串。
162+
163+
下面是`FileReader.readAsText()`方法的例子,用来读取文本文件。
164+
165+
```javascript
166+
// HTML 代码如下
167+
// <input type=’file' onchange='readfile(this.files[0])'></input>
168+
// <pre id='output'></pre>
169+
function readfile(f) {
170+
var reader = new FileReader();
171+
reader.readAsText(f);
172+
reader.onload = function() {
173+
var text = reader.result;
174+
var out = document.getElementById('output');
175+
out.innerHTML = '';
176+
out.appendChild(document.createTextNode(text));
177+
}
178+
reader.onerror = function(e) {
179+
console.log('Error', e);
180+
};
181+
}
182+
```
183+
184+
上面代码中,通过指定 FileReader 实例对象的`onload`监听函数,在实例的`result`属性上拿到文件内容。
185+
186+
下面是`FileReader.readAsArrayBuffer()`方法的例子,用于读取二进制文件。
187+
188+
```javascript
189+
// HTML 代码如下
190+
// <input type="file" onchange="typefile(this.files[0])"></input>
191+
function typefile(file) {
192+
// 文件开头的四个字节,生成一个 Blob 对象
193+
var slice = file.slice(0, 4);
194+
var reader = new FileReader();
195+
// 读取这四个字节
196+
reader.readAsArrayBuffer(slice);
197+
reader.onload = function (e) {
198+
var buffer = reader.result;
199+
// 将这四个字节的内容,视作一个32位整数
200+
var view = new DataView(buffer);
201+
var magic = view.getUint32(0, false);
202+
// 根据文件的前四个字节,判断它的类型
203+
switch(magic) {
204+
case 0x89504E47: file.verified_type = 'image/png'; break;
205+
case 0x47494638: file.verified_type = 'image/gif'; break;
206+
case 0x25504446: file.verified_type = 'application/pdf'; break;
207+
case 0x504b0304: file.verified_type = 'application/zip'; break;
208+
}
209+
console.log(file.name, file.verified_type);
210+
};
211+
}
212+
```

0 commit comments

Comments
 (0)