HTML 5中的文件处理之FileAPI
在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅 长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理 较为复杂或底层的数据。今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。
AD:
在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一。但文件处 理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理较为复杂或底层的数据。 今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。
今天要介绍的FileAPI,就是为解决这类问题而生的。
总览
FileAPI是一些列文件处理规范的基础,包含最基础的文件操作的JavaScript接口设计。其中最主要的接口定义一共有4个:
◆ FileList接口: 可以用来代表一组文件的JS对象,比如用户通过input[type="file"]元素选中的本地文件列表
◆ Blob接口: 用来代表一段二进制数据,并且允许我们通过JS对其数据以字节为单位进行“切割”
◆ File接口: 用来代步一个文件,是从Blob接口继承而来的,并在此基础上增加了诸如文件名、MIME类型之类的特性
◆ FileReader接口: 提供读取文件的方法和事件
这里有两点细节需要注意:
1. 我们平时使用input[type="file"]元素都是选中单个文件,其本身是允许同时选中多个文件的,所以会用到FileList
2. Blob接口和File接口可以返回数据的字节数等信息,也可以“切割”,但无法获取真正的内容,这也正是FileReader存在的意义,而文件大小不一时,读取文件可能存在明显的时间花费,所以我们用异步的方式,通过触发另外的事件来返回读取到的文件内容
接口描述
这4个接口其实并不复杂,也很好理解(接口中的“#Foo”表示任意Foo类型的对象):
FileList接口
- #FileList[index] // 得到第index个文件
Blob接口
- #Blob.size // 只读特性,数据的字节数
- #Blob.slice(start, length) // 将当前文件切割并将结果返回
File接口
- #File.size // 继承自Blob,意义同上
- #File.slice(start, length) // 继承自Blob,意义同上
- #File.name // 只读属性,文件名
- #File.type // 只读属性,文件的MIME类型
- #File.urn // 只读属性,代表该文件的URN,几乎用不到,暂且无视
FileReader方法
- #FileReader.readAsBinaryString(blob/file) // 以二进制格式读取文件内容
- #FileReader.readAsText(file, [encoding]) // 以文本(及字符串)格式读取文件内容,并且可以强制选择文件编码
- #FileReader.readAsDataURL(file) // 以DataURL格式读取文件内容
- #FileReader.abort() // 终止读取操作
FileReader事件
- #FileReader.onloadstart // 读取操作开始时触发
- #FileReader.onload // 读取操作成功时触发
- #FileReader.onloadend // 读取操作完成时触发(不论成功还是失败)
- #FileReader.onprogress // 读取操作过程中触发
- #FileReader.onabort // 读取操作被中断时触发
- #FileReader.onerror // 读取操作失败时触发
FileReader属性
- #FileReader.result // 读取的结果(二进制、文本或DataURL格式)
- #FileReader.readyState // 读取操作的状态(EMPTY、LOADING、DONE)
代码示例
举例一:控制file控件,读取其中的第二个文件,并将其文本内容在控制台输出
- var input = document.querySelector('input[type="file"]'); // 找到第一个file控件
- var firstFile = input.files[0]; // file控件的files特性其实就是一个FileList类型的对象
- var secondFile = input.files[1]; // 当file控件的multiple特性为true时,我们可以同时选择多个文件,通过input.files[n]可以按序访问这些文件
- var reader = new FileReader(); // 新建一个FileReader类型的对象
- reader.readAsText(secondFile); // 按文本格式读取file控件中的第二个文件
- reader.onloadend = function (e) { // 绑定读取操作完成的事件
- console.log(reader.result); // 取得读取结果并输出
- };
举例二:给一个含utf-8编码的文本文件file去掉BOM头信息
- var size = file.size; // 先取得文件总字节数
- var result = file.slice(3, size - 3); // 用slice方法去掉开头的3个字节
最后,对FileAPI实践的三点注意
1. 由于规范尚未截稿,#File.urn尚存较大变数,webkit并未实现此特性
2. #Blob.slice在webkit内核中加入了前缀,即#Blob.webkitSlice,且第二个参数不是“length”,而是“end”,话句话说,上面的示例二应改为file.webkitSlice(3, size)才能生效
3. 规范中还明确规定了各种出错处理和异常处理,这些内容是同样重要的:不论对于一套完备的规范,还是对于一个健壮的程序而言。由于篇幅有限,这部分就不细说了,大家可以在W3C官网自由查阅
以上就是FileAPI的简单介绍。万丈高楼平地起,后面的文件操作会更神奇更有趣。
HTML 5中的文件处理之FileAPI的更多相关文章
- HTML 5中的文件处理之FileAPI(转载)
原文地址:http://developer.51cto.com/art/201202/319435.htm 在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串 ...
- js/jquery 获取本地文件的文件路劲 获取input框中type=‘file’ 中的文件路径(转载)
原文:http://blog.csdn.net/niyingxunzong/article/details/16989947 js/jquery 获取本地文件的文件路劲 获取input框中type= ...
- 浏览器中用JavaScript获取剪切板中的文件
本文转自我的个人网站 , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/ ,欢迎前往交流讨论 在网页上编辑内容 ...
- java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
(转自:http://blog.csdn.net/gangwazi0525/article/details/7569701) import java.io.File; public class Rea ...
- C#递归遍历子目录与子目录中的文件
[转载]作者:weixingstudio 采用C#,通过指定一个路径,来递归的遍历所有的子目录以及子目录中的文件,建一个类似资源管理器的目录树 先递归的遍历所有的子目录,如果没有子目录以后,则遍历所有 ...
- Linux中检索文件
1 , Use locate command It is a fast way to find the files location, but if a file just created ,it w ...
- [转]MSI安装程序中的文件替换
原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...
- JavaWeb中读取文件资源的路径问题
在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...
- SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏
如果在客户端计算机上启动Microsoft SQL Server 2012的 ClickOnce 版本的 Microsoft SQL Server 报表生成器时出现"无法检索应用程序文件.部 ...
随机推荐
- 网站压力测试 工具webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好用,安装使用也特别方便,并且非常小. 主要是 -t 参数用着比较爽,下面参考了张宴的文章 ...
- MySql的隔离级别总结
使用MySql也有一段时间了,但是很多MySql相关或者说是数据库相关的知识还是一知半解,最近在学hibernate这个框架时碰到挺多和数据库相关的知识盲区,所以下面根据自己对MySql系统相关知识消 ...
- 撩课-Python-每天5道面试题-第3天
一. 代码实现: 计算1到100之间, 所有的奇数之和 result = , ): result += i print(result) 二. 代码实现: 接收用户输入数字, 求出从0至这个数字的累加和 ...
- IDEA快捷键使用说明
sout : 输出打印语句 System.out.println(); "内容".sout : 也是打印 System.out.println("内容"); ...
- 1..net mvc的原理概述
请求过来,根据ip和端口,由iis服务器进行接收,如果是静态文件则直接返回文件内容,如果无法解析,则根据映射规则找到对应请求后缀 的ASPNET_ISAPI.dll处理程序集,交由其进行处理. 1.此 ...
- ASP.NET MVC与ASP.NET WebForm
ASP.NET MVC是微软公司的一款WEB开发框架,整合了“模型-视图-控制器”架构的高效与整洁,是敏捷开发最现代的思想与技术.它是传统ASP.NET WebForm的一个完善的替代品. 1.当今的 ...
- C/C++:判断机器是32位还是64位
要求是不使用sizeof,一开始写了个看似可以,但是有问题的方法: long* a = NULL; ; int n = (char*)b - (char*)a; 这个方法等价于sizeof(long) ...
- jq中的isArray方法分析,如何判断对象是否是数组
<!DOCTYPE html> <html> <head> <title>jq中的isArray方法分析</title> <meta ...
- UVA1185 Big Number
题目大意:求十进制下x!的位数 这题其实就是要求\(\lg\)函数值的前缀和啊 对于一个数x,若\(\lg x=y\),则其位数为\(\lfloor y+1 \rfloor\) 然后对于对数,我们有\ ...
- Vuejs入门级简单实例
Vue作为2016年最火的框架之一,以其轻量.易学等特点深受大家的喜爱.今天简单介绍一下Vue的使用. 首先,需要在官网下载vuejs,或者直接用cdn库.以下实例使用Vue实现数据绑定与判断循环: ...