JavaScript File API总结

1.基本思路
HTML5在DOM中为文件输入元素添加了一个files集合,在通过文件输入字段选择了一个或多个文件时,files集合将包含一组File对象,每个File对象对应着一个文件,其中每个文件有name, size, type, lastModifiedDate属性。通过监听change事件并读取files集合就可以知道选择的每个文件的信息。示例代码如下:

var filesList = document.getElementById("files-list");
EventUtil.addHandler(filesList, "change", function(event){
    var files = EventUtil.getTarget(event).files,
    i = 0,
    len = files.length;
    while(i < len){
        console.log(files[i].name + file[i].type);
        i++;
    }
});

2.FileReader类型
其实现方式是一种异步文件读取机制,可以把FileReader想象成XMLHttpRequest,区别是它读取的是文件系统,而不是远程服务器。FileReader提供一下几个方法。
(1)readAsText(file, encoding):以纯文本的方式读取文件,将读取到的文本保存在result属性中,encoding用于指定编码的类型,可选。
(2)readAsDataURL(file):读取文件并将文件以数据URI的形式保存在result属性中
(3)readAsBinaryString(file):读取文件并将一个字符串保存在result属性中,字符串中的每个字符表示一个字节。
(4)readAsArrayBuffer(file):读取文件并将一个包含文件的内容的ArrayBuffer保存在result属性中。
由于读取文件的过程是异步的,所以FileReader会涉及三个主要的事件。
progress(是否读取新数据):触发该事件以后,通过事件对象可以获得lengthComputable、loaded和total属性。
error(是否发生错误): 初始error事件时,相关信息将被保存到FileReader的error属性中,error属性是一个对象,其只有一个属性code(错误码),1表示未找到文件,2表示安全性错误,3表示读取中断,4表示文件不可读,5表示编码错误。
load(是否已经读完整个文件): 文件成功加载后会触发load事件。
实例代码如下所示:

var filesList = document.getElementById("files-list");
EventUtil.addHandler(filesList, "change", function(event){
    var info = "",
        output = document.getElementById("output"),
        progress = document.getElementById("progress"),
        files = EventUtil.getTarget(event).files,
        type = "default",
        reader = new FileReader();
    if(/image/.test(files[0].type)){
        reader.readAsDataURL(file[0]);
        type = "image";
    } else {
        reader.readAsText(files[0]);
        type = "text";
    }
    reader.onerror = function(){
        output.innerHTML = "Could not read file, error code is" + reader.error.code;
    };
    reader.onprogress = function(){
        if(event.lengthComputable){
            progress.innerHTML = event.loaded + "/" + event.total;
        }
    };
    reader.onload = function(){
        var html = "";
        switch(type){
            case "image":
                html = "<img src=\" + reader.result + "\">";
                break;
            case "text":
                html = reader.result;
                break;
        }
        output.innerHTML = html;
    }
});

3.读取文件的部分内容
可以通过File对象的slice()方法实现读取文件的部分内容,方法返回的是Blob实例,Blob是File类型的父类型,在不同的浏览器中方法名不同,如下是一个通用的函数。

function blobSlice(blob, startByte, length){
    if(blob.slice){
        return blob.slice(startByte, length);
    } else if(blob.webkitSlice){
        return blob.webkitSlice(startByte, length);
    } else if(blob.mozSlice){
        return blob.mozSlice(startByte, length);
    } else {
        return null;
    }
}

下面是使用该方法的代码:

var filesList = document.getElementById("files-list");
EventUtil.addHandler(filesList, "change", function(event){
    var info = "",
        output = document.getElementById("output"),
        progress = document.getElementById("progress"),
        files = EventUtil.getTarget(event).files,
        reader = new FileReader();
        blob = blobSlice(files[0], 0, 32);
    if(blob){
        reader.readAsText(blob);
        reader.onerror = function(){
            output.innerHTML = "Could not read file, error code is" + reader.error.code;
        };
        reader.onload = function(){
            output.innerHTML = reader.result;
        }
    } else {
        alert("Your browser dosen't support slice()");
    }
});

4.对象URL
后期再加….

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值