HTML5的File API使用介绍

File API的宗旨是为Web开发人员提供一种安全的方式,以便在客户端访问用户计算机中的文件,并更好地对这些文件执行操作。

HTML5虽然可以让我们访问本地文件系统,但是文件只有在用户触发了文件读取行为才能读取到File API,这通常在发生在表单文件选择和拖拽的情况下。

一. File API的兼容性

File API在各大主流浏览器中的支持情况如下图所示:

备注:图片转载自: http://www.ibm.com/developerworks/cn/web/1210_jiangjj_html5log/

浏览器对 File API 支持情况的更详细信息可以参考网站 http://caniuse.com/#search=File 。

可以用下面的方法检测当前浏览器是否支持File API:

function checkSupportFileAPI() {
    if(window.File && window.FileList && window.FileReader) {
        return true;
    } else {
        return false;
    }
}
二. File对象的属性

FileAPI在表单中的文件输入字段的基础上,又添加了一些直接访问文件信息的接口。HTML5在DOM中为文件输入元素添加了一个file集合。在通过文件输入字段选择了一或多个文件时,files集合中将包含一组File对象,每个File对象对应着一个文件。每个File对象都有下列只读属性:

name : 本地文件系统的文件名;
size :文件的字节大小;
type :String类型,文件的MIME类型;
lastModifiedDate :String类型,文件最后被修改的时间。
在HTML5中,通过添加 multiple 属性,file控件内允许一次放置多个文件。控件内的每一个选择的文件都是一个file对象。

例子:通过监听change事件,并读取files集合就可以知道每个文件的信息:

<input type="file" name="" id="filesList" multiple>

<script type="text/javascript">
    var filesList = document.getElementById("filesList");
    filesList.addEventListener("change", function(e) {
        var files = this.files,
            i = 0,
            len = 0;
        if(files) {
            len = files.length;
        }
        while(i < len) {
            console.log(files[i].name + "( " + files[i].type + ", " + files[i].size + "bytes )");
            i++;
        }
    });
</script>
选择三个文件后,console中输出如下:

a.jpg( image/jpeg, 1499704bytes )
b.png( image/png, 395511bytes )
c.jpg( image/jpeg, 1614001bytes )
三. FileReader对象

3.1 FileReader读取文件数据的方法

FileReader类型实现的是一种一部文件读取机制。可以把FileReader想象成XMLHttpRequest,区别只是它读取的是文件系统,而不是远程服务器。FileReader提供一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据。为了读取文件中的数据,FileReader提供了如下几个方法:

readAsText(file|blob [, encoding]) :以纯文本形式读取文件,将读取到的文本保存在result属性中。第二个参数用于指定编码类型,可选。
readAsDataURL(file|blob) :读取文件并将文件以数据URI的形式保存在result属性中。
readAsBinaryString(file|blob) :读取文件并将一个字符串保存在result属性中,字符串中的每个字符表示一个字节。
readAsArrayBuffer(file|blob) :读取文件并将一个包含文件内容的ArrayBuffer保存在result属性中。
abort() :中断读取操作。
这些读取文件的方法为灵活地处理文件数据提供了极大的便利。例如,可以读取图像文件并将其保存为数据URI,一遍将其显示给用户;或者为了解析方便,可以将文件读取为文本形式。

3.2 FileReader的兼容性

实现了FileAPI的所有浏览器都支持readAsText()和readAsDataURL()方法。但是IE10 PR 2不支持readAsBinaryString()和readAsArrayBuffer()。IE9及其以下版本浏览器不支持FileReader API。

检查当前浏览器是否支持FileReader API的方法如下:

if(typeof FileReader == "undefined") {
    alert("您的浏览器不支持FileReader API.");
} else {
    var reader = new FileReader();
}
3.3 FileReader的事件

由于读取文件的过程是异步的,因此FileReader也提供了几个事件,常用的有:

progress() :数据读取中。
error() :数据读取出错时触发。
load() :数据读取成功完成时触发。
abort() :数据读取中断时触发。
loadstart() :数据读取开始时触发。
loadend() :数据读取完成时触发,无论成功或失败。
每过50ms左右,就回触发一次progress事件通过事件对象可以获得与XHR的progress事件相同的信息(属性):lengthComputable、loaded和total。每次progress事件中都可以通过FileReader的result属性读取到文件内容。

当无法读取文件时,就会触发error事件。触发error事件时,相关的信息将保存到FileReader的error属性中。这个属性将保存一个对象,该对象只有一个属性code,即错误码。这个错误码的属性值如下:

1:表示未找到文件;
2:表示安全性错误;
3:表示读取中断;
4:表示文件不可读;
5:表示编码错误。
文件加载成功后会触发load事件。如果发生了error事件,就不会发生load事件。

例子:

<input type="file" name="" id="filesList">
<div id="progress"></div>
<div id="output"></div>

<script type="text/javascript">
    var filesList = document.getElementById("filesList");
    filesList.addEventListener("change", function(e) {
        var info = "",
        output = document.getElementById("output"),
        progress = document.getElementById("progress"),
        files = this.files,
        type = "default",
        reader = new FileReader();

        if(/image/.test(files[0].type)) {
            reader.readAsDataURL(files[0]);
            type = "image";
        } else {
            reader.readAsText(files[0]);
            type = "text";
        }

        reader.onerror = function() {
            output.innerHTML = "error code: " + reader.error.code;
        };
        reader.onprogress = function(event) {
            console.log("lengthComputable: " + event.lengthComputable);
            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.toString();
                    break;
            }
            output.innerHTML = html;
        }
    });
</script>
在这个例子中,读取了表单字段中选择的文件,并将其内容显示在页面中如果是图片类型的文件,则将其保存为数据URI,并显示出读取的内容;如果是文件而不是图片,则以字符串形式读取并显示其内容。

时间: 2024-10-06 00:27:27

HTML5的File API使用介绍的相关文章

HTML5使用 JavaScript File API 实现文件上传

文件来源:http://www.ibm.com/developerworks/cn/web/1101_hanbf_fileupload/ 简介:File API 是 Mozilla 向 W3C 提出的一个草案,旨在用标准 JavaScript API 实现本地文件的读取.File API 将极大地方便 Web 端的文件上传等操作,并有望成为未来的 HTML 5 规范的一部分.本文将介绍 File API 的概况,并用两个实例展示 File API 的应用. 概述 以往对于基于浏览器的应用而言,访

JavaScript File API实现文件上传预览_javascript技巧

一.概述以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScript 一直是无法访问本地文件的.于是,为了在浏览器中能够实现诸如拖拽并上传本地文件这样的功能,我们就不得不求助于特定浏览器所提供的各种技术了.比如对于 IE,我们需要通过 ActiveX 控件来获取对本地文件的访问能力,而对于 Firefox,同样也要借助插件开发.由于不同浏览器的技术实现不尽相

使用HTML5的File实现base64和图片的互转

刚接触到一个内联图片的概念,内联图片即使把图片文件编码成base64 看下面代码即是内联问题 可以减少http的请求,缺点是不能跨域缓存!   复制代码 代码如下: <img src="data:image/jpeg;base64,/9j/4QqsRX..." alt=""> 然后在线如何把图片转化成base64 如果只依靠单纯的javascript是有权限问题的 js不允许操作本地的file文件或文件夹 为了安全问题 现在html5来了 百度了下有不少

通过Canvas及File API缩放并上传图片完整示例

创建一个只管的用户界面,并允许你控制图片的大小.上传到服务器端的数据,并不需要处理enctype为 multi-part/form-data 的情况,仅仅一个简单的POST表单处理程序就可以了. 好了,下面附上完整的代码示例 Canvas简介  canvas 是一个HTML5新增的DOM元素,允许用户在页面上直接地绘制图形,通常是使用JavaScript.而不同的格式标准也是不同的,比如SVG是光栅API(raster API) 而VML却是向量API(vector API).可以考虑使用Ado

使用HTML5 File API实现客户端log读写

本文主要介绍使用http://www.aliyun.com/zixun/aggregation/79228.html"> HTML5 File API 实现客户端 log 读写,并实现客户端 log 下载功能,帮助用户更方便的收集客户端 log. 在 HTML 5 里,从 Web 网页上访问本地文件系统变的十分的简单,那就是使用 File API. 这个 File 规范说明里提供了一个 API 来表现 Web 应用里的文件对象,您可以通过编程来选择它们,访问它们的信息.File API 有

html5 File API的文件操作使用例子

写在前面 这段时间一直有朋友在问文件上传下载的事,搜一下论坛发现相关的问题不少,但是不够系统,本着为人民服务的态度本文试着将一些问题整理一下,争取用初学者可以更明确的去处理相关的问题.文件上传是开发中绕不过的一个坎儿,对于很多没有经验的人来说,简直懵逼,目前我所知道的上传方式有下面这几种: 传统flash上传 隐藏iframe框上传 表单数据提交 HTML5的新工具--File API 本文限于篇幅先介绍最后一种使用html5 File API进行文件上传的相关细节. 历史上,JavaScrip

HTML5全屏(Fullscreen)API详细介绍

  HTML5全屏(Fullscreen)API详细介绍          在越来越真实的web应用程序中,JavaScript也变得越来越给力. FullScreen API 是一个新的JavaScript API,简单而又强大. FullScreen 让我们可以通过编程的方式来向用户请求全屏显示,如果交互完成,随时可以退出全屏状态. 在线演示Demo: Fullscreen API Example (在此Demo中,可以Launch ,Hide ,以及Dump显示相关属性,可以通过chrom

《C++ 黑客编程揭秘与防范》——1.3 简单API的介绍

1.3 简单API的介绍 C++ 黑客编程揭秘与防范 下面介绍一些在黑客编程中会用到的API函数,尽量排一点简单易用的函数,用简单的几行代码来完成一定的功能,希望大家能在这里体会到编程乐趣,不至于被大段的代码影响了自己前进的心情. 1.3.1 复制自身程序到Windows目录和系统目录下 一般的病毒木马都有这种类似的功能,完成这个功能其实并不复杂,我们来拆解思考一下实现这段代码的步骤. 复制是一个拷贝的过程.既然是拷贝,就要知道拷贝的原位置和目的位置.也就是整个过程其实分3步,首先要得到自身程序

How to Use HTML5 FUll Screen API(如何使用HTML5全屏接口)

原文链接:http://www.sitepoint.com/use-html5-full-screen-api/        如果你不太喜欢变化太快的东西,那么web开发可能不适合你.我曾在2012年末有写过Full-Screen API的介绍,并且当时就提到其实现细节可能会被修改,但是没有想到一年后我需要重写!本篇的所讲的内容也许不是最新的,但是非常感谢David Storey帮我重点归纳出近期技术方面的变化....        什么是Full-Screen API?        此AP