FileReader读取⽂件详解
FileReader是⼀种异步⽂件读取机制,结合input:file可以很⽅便的读取本地⽂件。
input:file
在介绍FileReader之前,先简单介绍input的file类型。
<input type="file" id="inputBox">
input的file类型会渲染为⼀个按钮和⼀段⽂字。点击按钮可打开⽂件选择窗⼝,⽂字表⽰对⽂件的描述(⼤部分情况下为⽂件名);file类型的input会有files属性,保存着⽂件的相关信息。
点击按钮上传⼀个⽂件后,在控制台打印input.files,如下:
可以发现input.files是⼀个数组,由传⼊的file对象组成。每个file对象包含以下属性:
lastModified:数值,表⽰最近⼀次修改时间的毫秒数;
lastModifiedDate:对象,表⽰最后⼀次表⽰最近⼀次修改时间的Date对象(⾼程中说是字符串,根据上图可看出应该为对象,为了层级清晰未对其展开,⼤家可⾃⾏查看,其可调⽤Date对象的有关⽅法,例如
getDay⽅法);
name:本地⽂件系统中的⽂件名;
size:⽂件的字节⼤⼩;
type:字符串,⽂件的MIME类型;
weblitRelativePath:此处为空;当在input上加上webkitdirectory属性时,⽤户可选择⽂件夹,此时weblitRelativePath表⽰⽂件夹中⽂件的相对路径。⽐如:
<input type="file" id="inputBox" webkitdirectory>
点击按钮添加⼀个包含3个⽂件的名为php的⽂件夹后,控制台打印inputBox.files,如下:
可看出,此时weblitRelativePath表⽰当前file对象的⽂件在⽂件夹中的路径。
FileReader
以上file对象只获取到了对⽂件的描述信息,但没有获得⽂件中的数据,⽽inputBox.value也只是保存的是⽂件的绝对路径(这⾥就不展⽰了,⼤家可以⾃⼰试⼀试)。我们可以通过html5提供的FileReader读
inputtypefile不上传文件取到⽂件中的数据。
⾸先创建⼀个FileReader实例:
var reader = new FileReader();
⽅法
FileReader提供了如下⽅法:
readAsArrayBuffer(file)按字节读取⽂件内容,结果⽤ArrayBuffer对象表⽰
readAsBinaryString(file)按字节读取⽂件内容,结果为⽂件的⼆进制串
readAsDataURL(file)读取⽂件内容,结果⽤data:url的字符串形式表⽰
readAsText(file,encoding)按字符读取⽂件内容,结果⽤字符串形式表⽰
abort()终⽌⽂件读取操作
readAsDataURL和readAsText较为常⽤,这⾥只对这两者进⾏说明。
readAsDataURL会将⽂件内容进⾏base64编码后输出:
var inputBox = ElementById("inputBox");
inputBox.addEventListener("change",function(){
var reader = new FileReader();
//读取完成后,数据保存在对象的result属性中
console.sult)
}
})
控制台为当前所传⽂件的base64编码表⽰。由于媒体⽂件的src属性,可以通过采⽤⽹络地址或base64的⽅式显⽰,因此我们可以利⽤readAsDataURL实现对图⽚的预览。
<input type="file" id="inputBox" >
<img src="" id="img">
var inputBox = ElementById("inputBox");
var img = ElementById("img");
inputBox.addEventListener("change",function(){
var reader = new FileReader();
//读取完成后,将结果赋值给img的src
img.src = sult
}
})
如上,只需将读取的结果赋给图⽚的src属性,即可预览图⽚:
readAsText(file,encoding)可按指定编码⽅式读取⽂件,但读取⽂件的单位是字符,故对于⽂本⽂件,只要按规定的编码⽅式读取即可;⽽对于媒体⽂件(图⽚、⾳频、视频),其内部组成并不是按字符排列,故采⽤readAsText读取,会产⽣乱码,因此不是最理想的读取⽂件的⽅式。
事件
onabort当读取操作被中⽌时调⽤
onerror当读取操作发⽣错误时调⽤
onload当读取操作成功完成时调⽤
onloadend当读取操作完成时调⽤,⽆论成功或失败
onloadstart当读取操作开始时调⽤
onprogress在读取数据过程中周期性调⽤
var inputBox = ElementById("inputBox");
var count=0;
inputBox.addEventListener("change",function(){
var reader = new FileReader();
console.log("加载成功")
}
console.log("开始加载")
}
console.log("加载结束")
}
count++;
console.log("加载中"+count)
}
})
每过50ms左右,就会触发⼀次progress事件,对于较⼤的⽂件可以利⽤progress实现进度条;onload事件在onloadend之前触发。
由于种种原因⽆法读取⽂件时,会触发error事件。触发error事件时,相关信息保存在FileReader对象的error属性中,这个属性将保存⼀个对象,此对象只有⼀个属性code,即错误码。1表⽰未到⽂件,2表
⽰安全性错误,3表⽰读取中断,4表⽰⽂件不可读,5表⽰编码错误。
如果想中断读取过程,可以调⽤abort⽅法,就会触发abort事件。
⽆论触发load,error,abort事件中哪⼀个,最终都会触发loadend事件。