HTML 5 关于文件读取学习笔记

HTML 5中File API是HTML 5中一大亮点,可以让我们去读取本地文件。让所有开发者兴叹!通过File API规范提供了多种访问文件接口。

 


浏览器对HTML 5中File相关接口的支持情况

在使用File API时,可能需要检测浏览器的支持情况,特征检测代码如下:

复制
// 检测浏览器是否支持File API相关接口.
if (window.File && window.FileReader && window.FileList && window.Blob) {
    //支持滴
} else {
    //不支持
    alert('HTML5 File API在您的浏览器里是不完全支持的。');
}
浏览器中File API并不能想读取文件就可以读取文件的,你必须通过用户的行为才能触发文件的读取。比如,进入网页,当用户执行点击操作后,选择文件后,通过File API就可以获取文件的相关信息。支持File API的浏览器有IE10+、FireFox 3.5+、Opera 10.6+、Safari 5+、Chrome和IOS版的Safari及Android版的Webkit、UC ;当然,它们多数并不是完全支持的。

关于File对象的相关说明

在浏览器中,由于安全限制,File对象一般都是通过点击type=file的input表单、HTML 5的拖放API来获取FileList数组、通过在输入框中粘贴时,里面包含了一个或多个File对象。File对象中包含着文件的相关信息,比如文件名,文件大小,文件类型等。

对象类型 描述
File 独立文件对象,主要包含以下属性:name、size、type、lastModifiedDate及slice()方法(可以直接转成对象URL或通过Fil API读取)
FileList File对象的类数组序列(有时文件多选时,会出现)
Blob Blob对象是File类型的父类型,是File对象通过slice()方法读取整个文件的部分数据。Blob类型有两个属性size、type,当然还支持slice()方法
下面对以上属性作以简单介绍:

name:本地文件系统中的文件名
size:文件的大小,以字节为单位
type:文件的MIME类型(字符串)
lastModifiedDate:文件最后修改时间,字符串(仅Chrome支持)
下面是一个简单示例,通过表单File选择文件然后显示文件的相关信息,下面的代码:

HTML 代码:

复制
<!-- start: 输入表单 -->
<input type="file" name="file" multiple />
<!-- end: 输入表单 -->
<!-- start: 模板 -->
<div class="remark">
    <p>文件名称:<!--name--></p>
    <p>文件大小:<!--size--> byte</p>
    <p>文件类型:<!--type--></p>
    <p>文件最后修改时间:<!--lastModifiedDate--></p>
    <hr/>
</div>
<!-- end: 模板 -->
JavaScript 代码:

复制
if(!(window.File && window.FileReader && window.FileList && window.Blob)) {
    alert('您的浏览器不完全支持FileReader API接口,请尝试使用支持HTML 5的浏览器!');
    throw new Error('browser not support File API');
}
 
/**
 * * 解析模板文件
 * @param template  模板字符串
 * @param scope     模板作用域
 * return [string]  解析过后的字符串
 */
function templateParse(template, scope) {
    if(typeof template != "string") return ;
    return template.replace(/<!--\w+--\>/gi, function(matchs) {
        var returns = scope[matchs.replace(/(<!--)|(--\>)/g, "")];
        return (returns + "") == "undefined"? "": returns;
    });
}
 
window.addEventListener('load',function(){
    var inputField = document.querySelector('input[name="file"]'),      //表单输入框
        remark = document.querySelector('div.remark'),
        template = remark.innerHTML;                                   //模板文件
 
    inputField.addEventListener('change', function(){
        var files = this.files,i= 0, t = "";
        for(;i<files.length; i++) {
            t += templateParse(template, files[i]);
        }
        remark.innerHTML = t;
    },false);
}, false);
FileReader类型

与以上数据结构结合使用时,FileReader可以用JavaScript事件来处理异步读取文件。因为可以监控读取进度、找出错误并确定加载何时完成。FileReader与XMLHttpRequest的事件模型有很多相似之处。区别就在与FileReader是读取本地文件,而XMLHttpRequest是用来读取服务器上的文件。下面是一段简单的代码,来说明File类型文件:

FileReader类型实现了一种异步读取文件的方式;提供了几个方法:

readAsText(file, [encoding]):以纯文件的形式读取文件,并将取到的文本保存在实例对象的result属性中。第二个参数表示读取的编码类型,可选传
readAsDataURL(file):读取文件,并将数据以数据URL的形式保存在实例对象result属性中,如可以直接赋给图片的src等 (会转成base64编码)
readAsBinaryString(file):读取文件并将一个字符串保存在result属性中,字符串中的每个字符表示一个字节 (IE 10中尚未实现)
readAsArrayBuffer(file):读取文件并将一个包含文件内容的ArrayBuffer保存在result属性中 (IE 10中尚未实现)
abort():终止当前的读取操作
由于读取文件的过程是异步的,因此FileReader也就提供了相应的事件处理,如下:

progress:通常用来跟踪当前文件读取的进度,它一般在文件读取的过程中,每隔50ms左右触发一次。通过事件对象可以获取与XHR的progress事件相同的信息:lengthComputable、loaded和total。
error:在读取过程中,产生错误时的回调函数;如果产生了error事件,那么load事件就不会再产生了。触发error事件,相关的信息将会保存到FileReader的error属性中,这个属性是一个对象,只有一个属性code,即错误码:1、文件未找到;2、安全性错误;3、读取中断;4、文件不可读。
load:文件读取成功的时回调
loadstart:开始读文件时的回调
abort:当读文件操作被终止时的回调
loadend:当文件读取完成时的回调(特别注意:这个事件是无论文件读取成功或是失败,都是会被执行的)
 

读取文件的部分内容

有的时候,为了读取文件的一部分而不是全部时,我们需要用到File对象的slice()方法。这个方法在FireFox中的实现叫mozSlice(),在Chrome中叫webkitSlice()。slice()方法接收两个参数,起始的字节及要读取的字节;方法返回一个Blob实例。以下是一个通用的处理函数:

复制
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;
    }
}
Blob类型有一个size属性和type属性,且也有一个slice()方法,因为我们可以继续切割数据。FileReader也是可以从Blob中读取数据,如下例所示(以选择一个大于32B的文件):

HTML 代码:

复制
<label for="text">请选择文件<input type="file" id="text" name="text" accept="text/*" /></label>
<p id="textRemark">暂无内容</p>
Js 代码:

复制
window.addEventListener('load',function(){
    var textInput = document.querySelector('input[name="text"]');
    textInput.addEventListener('change',function(){
        var files = this.files[0],
            reader = new FileReader(),
            blob = blobSlice(files, 0, 32),
            textRemark = document.querySelector('p#textRemark');
        if(blob) {
            //读取文件
            reader.readAsText(blob);
            //读取出错
            reader.addEventListener('error',function(){
                textRemark.innerHTML = '读取错误代码:' + reader.error.code;
            },false);
            //读取成功
            reader.addEventListener('load',function(e){
                textRemark.innerHTML = this.result;
            },false);
        } else {
            alert('你的浏览器不支持Slice方法');
        }
    },false);
},false);
对象URL

对象URL也被称为blob URL,指的是引用保存在File或Blob中数据的URL。使用对象URL的好处是,我们没有必要去调用File Reader就可以读取到对应的数据。为了创建对象URL,可以使用window.URL.createObjectURL()方法创建,并传入一个File或Bolb对象。其兼容的处理方案如下:

复制
function createObjectURL(blob) {
    if(window.URL) {
        return window.URL.createObjectURL(blob);
    }else if(window.webkitURL) {
        return window.webkitURL.createObjectUrl(blob);
    }else {
        return null;
    }
}
以下是一个示例,通过blob插入到img标签中:

HTML代码

复制
<label for="imageList">请选择文件<input type="file" id="imageList" multiple name="image" accept="image/*" /></label>
<p id="imageRemark">暂无内容</p>
JS 代码

复制
window.addEventListener('load',function(){
    var imageList = document.getElementById('imageList'),
        imageRemark = document.getElementById('imageRemark');
 
    imageList.addEventListener('change',function(e){
        if(!this.files.length) return ;
 
        var url = null,
                i= 0,
                l=this.files.length,
                html = '';
        for(;i<l;i++){
            url = createObjectURL(this.files[i]);
            if(url) {
                html+= '<img src=\"' + url +'\"/>';
            }
            url = null;
        }
 
        imageRemark.innerHTML = html;
 
    },false);
},false);
以上代码中,其实是直接读取图片文件放入到内存中,然后创建对象URL来形成内存中的引用。直接插入到img标签上,相比用FileReader来讲,效率确实高出很多。但由于文件读取是放在内存中,如果存在对图片的引用,那么图片占用的内存就不会被释放。要手动去清除内存的话,就可以直接把对象URL当作参数的形式传给window.URL.revokeObjectURL()。由于不同浏览器带的前缀不同,所以就有了以下的兼容函数:

复制
function revokeObject(url){
    if(window.URL) {
        window.URL.revokeObjectURL(url);
    } else if(window.webkitURL) {
        window.webkitURL.revokeObjectURL(url)
    }
}

一般来说,在页面卸载后,会自动释放对象URL所占用的内存。不过有时,为了及时释放内存,就可以使用上面的方法

时间: 2024-09-24 05:12:12

HTML 5 关于文件读取学习笔记的相关文章

php 常用文件操作学习笔记

1.获取文件名:basename(); 2.获取文件所在的目录:dirname(); 3.pathinfo()获取文件信息,返回结果为一个array,包括路径.文件全名.文件名和扩展名.例如:  代码如下 复制代码 $file = '/com/netingcn/error.log'; print_r(pathinfo($file)); 结果为: Array(     [dirname] => /com/netingcn     [basename] => error.log     [exte

【Linux】Linux用户、用户组、文件权限学习笔记

原文地址:http://www.sourcejoy.com/other_dev_tech/linux-user-and-file-manage.html 作者:HaiHai 发布时间:August 12, 2010 分类:综合技术 最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识. 学习这几样东西,得先掌握linux的权限系统相关知识. linux的权限系统主要是由用户.用户组和权限组成. 用户就是一个个的登录并使用linux的用户.linux内

Perl中的文件读写学习笔记_perl

一.打开.关闭文件 语法为open (filevar, filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号,filename为文件名,其路径可为相对路径,亦可为绝对路径. 复制代码 代码如下:  open(FILE1,"file1");  open(FILE1, "/u/jqpublic/file1"); 打开文件时必须决定访问模式,在PERL中有三种访问模式:读.写和添加.后两种模式的区别在于写模式将原文件覆盖,原有内容丢失,形式

Centos文件权限学习笔记

先看个实例: [root@local opt]#ls -al ls -al 命令是列出目录的所有文件,包括隐藏文件.隐藏文件的文件名第一个字符为'.' -rw-r--r--  1 root root    81 08-02 14:54 gtkrc-1.2-gnome2 -rw-------  1 root root   189 08-02 14:54 ICEauthority -rw-------  1 root root    35 08-05 10:02 .lesshst drwx-----

PHP操作XML文件学习笔记

原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作方式很多,这次学习的是通过DOMDocument进行操作,其他的操作方法可以参考 http://www.oschina.net/code/snippet_110138_4727 1.对XML文件的遍历 通过DOMDocument对于XML文件的操作的方法:首先要实例化一个DOMDocument类的对

动态网页学习:JSP学习笔记全记录

js|笔记|动态|网页 JSP学习笔记(一)-----概述 JSP学习笔记(二)-----使用Tomcat运行JSP文件 JSP学习笔记(三)-----使用JSP处理用户注册和登陆 JSP学习笔记(四)-----JSP动作的使用 JSP学习笔记(五)-----JSP中使用JavaBean JSP学习笔记(六)-----在多个JSP页面之间传递参数 JSP学习笔记(七)-----猜数字游戏 JSP学习笔记(八)-----include的运用 JSP学习笔记(九)-----JSP标签库

那些年,我还在学习C# 学习笔记续_C#教程

那些年,我还在学习C#续 那些年学习C#,就是对C#相关的一些知识有一个了解,等到要用时才不会找不到方向,比如说扩展方法,开始时怎么觉得没有用,后来了解到asp.net MVC,它可以用来扩展Html类,比如做一个分页的方法:所以对一门语言了解宽一些是没有坏处的:C#中还有一些在上文中没有提到的,如:读取文件.网络(socket)编程.序列化等,他们都是非常重要的啊,下面再来看一看吧! 一.读取文件 在文件读取学习时,一般都会提到字节流与字符流,前都按字节读取,后都按字符读取:我们通过FileS

php学习笔记--高级教程--读取文件、创建文件、写入文件

打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r 只读方式打开,将文件指针指向文件头 r+ 读写方式打开,将文件指针指向文件头 w 写入方式,指向文件头,如果不存在则尝试创建 w+ 读写方式,指向文件头,如果不存在则尝试创建 a 写入方式打开,指向文件末尾,如果不存在则尝试创建 a+ 读写方式打开,指向文件末尾,如果不存在则尝试创建 读取文件:fread:fread(); readfile

Perl学习笔记之文件操作

         这篇文章主要介绍了Perl学习笔记之文件操作,本文分别给出了打开文件.读取文件.写入文件代码实例,需要的朋友可以参考下              Perl对文件的操作,跟其它的语言类似,无非也就是打开,读与写的操作. 1. 打开文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #! c:/perl/bin/perl -w use utf8; use strict; use warnings;   my $filename = 'test.txt'