File API FileReader 对象在 Chrome 中的运行方式与在 FireFox、Opera 或 Internet Explorer 10 中的运行方式相同(是的,在 IE 中运行)。
简单示例
您首先声明一个新的阅读器实例:
var reader = new FileReader();
为它的各种事件定义你的回调:
reader.onloadend = function(){
document.body.style.backgroundImage = "url(" + this.result + ")";
}
然后将其传递给阅读:
reader.readAsDataURL(file);
小提琴:http: //jsfiddle.net/jonathansampson/K3A9r/
处理多个文件
当您处理多个文件时,情况会有所不同。虽然很明显我们需要循环遍历生成的 FileList,但我们还需要使用闭包来防止文件数据在多次迭代中被篡改:
// Continue only if we have proper support
if ( window.FileReader ) {
// Provide our logic upon the change even of our input
document.getElementById("collection").onchange = function(){
// Couple variables for handling each file
var counter = -1, file;
// Cycle over all files
while ( file = this.files[ ++counter ] ) {
// Create a reader for this particular file
var reader = new FileReader();
// Respond to the onloadend event of the reader
reader.onloadend = (function(file){
return function(){
var image = new Image();
image.height = 100;
image.title = file.name;
image.src = /^image/.test(file.type) ? this.result : "t9QlH.png";
document.body.appendChild( image );
}
})(file);
// Begin reading data for this file
reader.readAsDataURL( file );
}
}
}
小提琴:http: //jsfiddle.net/jonathansampson/jPTV3/
特征检测
尽管几乎所有现代浏览器都可以使用 FileReader,但您仍然需要确保不会对使用旧浏览器的用户造成任何骚动。在使用 FileReader 之前,请务必检查窗口对象是否存在:
if ( window.FileReader ) {
// Safe to use FileReader
}
在本地运行,从 Chrome
我应该注意,在 Chrome 的 file:/// 路径中运行它会导致体验失败。默认情况下,当前版本的 Chrome 不允许 file:/// 页面访问其他文件。--allow-file-access-from-files
您可以使用标志更改此行为加载 Chrome 。
请注意,此方法仅允许对打开它的浏览器实例上的文件进行文件访问。如果您希望将来所有浏览器实例都是这种情况,您可以从桌面修改快捷方式。只需右键单击 Chrome 快捷方式,然后转到属性。接下来,将标志添加到目标的末尾。