@@ -78,7 +78,7 @@ myBlob.slice(start,end, contentType)
78
78
79
79
` slice ` 方法有三个参数,都是可选的。它们依次是起始的字节位置(默认为0)、结束的字节位置(默认为` size ` 属性的值,该位置本身将不包含在拷贝的数据之中)、新实例的数据类型(默认为空字符串)。
80
80
81
- ### 读取文件
81
+ ### 获取文件信息
82
82
83
83
文件选择器` <input type="file"> ` 用来让用户选取文件。出于安全考虑,浏览器不允许脚本自行设置这个控件的` value ` 属性,即文件必须是用户手动选取的,不能是脚本指定的。一旦用户选好了文件,脚本就可以读取这个文件。
84
84
@@ -148,3 +148,65 @@ droptarget.ondrop = function (e) {
148
148
上面代码通过为拖放的图片文件生成一个 URL,产生它们的缩略图,从而使得用户可以预览选择的文件。
149
149
150
150
浏览器处理 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