简介: File API 是 Mozilla 向 W3C 提出的一个草案,旨在用标准 JavaScript API 实现本地文件的读取。File API 将极大地方便 Web 端的文件上传等操作,并有望成为未来的 HTML 5 规范的一部分。本文将介绍 File API 的概况,并用两个实例展示 File API 的应用。
File API 是 Mozilla 向 W3C 提交的一个草案,旨在推出一套标准的 JavaScript API,其基本功能是实现用 JavaScript 对本地文件进行操作。出于安全性的考虑,该 API 只对本地文件提供有限的访问。有了它,我们就可以很轻松的用纯 JavaScript 来实现本地文件的读取和上传了。目前,FireFox 3.6 是最先支持这一功能的浏览器。除此以外,最新版本的 Google Chrome 浏览器和 Safari 浏览器也有相应的支持。File API 有望成为 W3C 目前正在制定的未来 HTML 5 规范当中的一部分。
本文后续章节将对 File API 做一个基本的介绍。并为读者演示:如何利用 File API 实现基于 file input 控件的本地文件读取与上传;以及利用拖拽实现从用户系统批量上传文件的功能。通过本文,读者可以了解最新的 File API 的概况以及使用,从而为构建具有更好用户体验的 Web 2.0 应用提供参考。
File API 概览
File API 由一组 JavaScript 对象以及事件构成。赋予开发人员操作在 文件选择控件中选定文件的能力。图 1 展示了 File API 所有的 JavaScript 的组合关系。
图 1. File API 相关类图
类型 FileList 包含一组 File 对象。通常 FileList 对象可以从表单中的文件域()中拿取。Blob 对象代表浏览器所能读取的一组原始二进制流。Blob 对象中,属性 size 表示流的大小。函数 slice() 可以将一个长的 Blob 对象分割成小块。File 对象继承自 Blob 对象,在 Blob 对象基础上增加了和 File 相关的属性。其中,属性 name 表示文件的名字,这个名字去掉了文件的路径信息,而只保留了文件名。属性 type 表示文件的 MIME 类型。属性 urn 则代表这个文件的 URN 信息。为完成文件读取的操作,一个 FileReader 对象实例会关联 File 或 Blob 对象,并提供三种不同的文件读取函数以及 6 种事件。参见表 1 及表 2。
表 1. 文件读取函数
函数名称 | 功能 |
---|---|
readAsBinaryString() | 读取文件内容,读取结果为一个 binary string。文件每一个 byte 会被表示为一个 [0..255] 区间内的整数。函数接受一个 File 对象作为参数。 |
readAsText() | 读取文件内容,读取结果为一串代表文件内容的文本。函数接受一个 File 对象以及文本编码名称作为参数。 |
readAsDataURL | 读取文件内容,读取结果为一个 data: 的 URL。DataURL 由 RFC2397 定义,具体可以参考 http://www.ietf.org/rfc/rfc2397.txt。 |
表 2. 文件读取事件
事件名称 | 事件说明 |
---|---|
Onloadstart | 文件读取开始时触发。 |
Progress | 当读取进行中时定时触发。事件参数中会含有已读取总数据量。 |
Abort | 当读取被中止时触发。 |
Error | 当读取出错时触发。 |
Load | 当读取成功完成时触发。 |
Loadend | 当读取完成时,无论成功或者失败都会触发。 |
回页首
File API 简单示例
接下来我们用一个简单的例子展示 File API 的基本用法。这个示例包含两个代码文件,index.html 包含 Web 端的 HTML 代码和处理上传的 JavaScript 代码;upload.jsp 包含服务器端接收上传文件的代码。请参见附件中的 sourcecode.zip。在这个例子中,我们将显示一个传统的带有 File 选择域的表单。当用户选择文件,点击提交后,我们使用 File API 读取文件内容,并通过 XMLHttpRequest 对象,用 Ajax 的方式将文件上传到服务器上。图 2 展示了运行中的演示截图。
图 2 File API 演示
我们逐步展示其中的代码。清单 1 给出了代码的 HTML 部分。
清单 1 示例代码的 HTML 部分
Progessing (in Bytes):
/
|
可以看到,我们用普通的