前言,文件读取是提高应用体验度的必须接口,应用场景中需求很频繁。

Js处理文件读取,由于处于安全方面的考虑,在2000年以前,都是以“<input type="file">”字段来实现文件上传,这样有很多的局限性,比如无法在本地上传时看到自己上传的文件(如图片),也无法读取到文件内容,审查文件流大小。

HTML5中,主流浏览器引擎都支持新的FILE API,为“<input type="file">”提供一个files数组,包含每个文件,为每个文件对象提供4个属性:name,size,type,lastModifiedDate,分别表示文件的名称,文件流大小,MIME类型和上次被修改的时间。在实际应用中,有时为了控制上传文件的大小,通过size就可以在前端提示用户选择合适范围内大小的文件。

HTML5提供了一个原型FileReader,通过该原型的实例可以得到4个主要的方法:

  1. readAsText(file,encoding),以纯文本形式读取文件,将读取的文本保存到该实例对象的result属性中。第二个参数指定编码类型,是可选的;
  2. readeAsDataURL(file),读取文件并将文件以数据URI的形式保存在result属性中;
  3. readAsBinaryString(file),读取文件并将一个字符串保存在result属性中,字符串中的每个字符表示一字节。
  4. readAsArrayBuffer(file):读取文件并将一个包含文件内容的ArrayBuffer保存在result属性中。

其中,通过readAsDataUrl(file)可以读取到文件地址,如果是图片文件,可以结合src属性显示图片文件,

具体实例可以参考实例:https://github.com/Johnharvy/html-dom-tools/.

由于文件读取加载的过程是异步的,即文件加载读取是需要排队等待时间的,所以FileReader也提供了几个事件,用于在文件加载的各个阶段触发,分别为process,error和load,分别表示是否又读取了新数据,是否发生了错误以及是否已经读完了整个文件。

每次过50ms,就会触发一次process事件,每次process事件都可以通过FileReader的result属性读取到文件的相关内容。

如果由于某些原因无法读取文件,就会触发error事件并默认带一个参数code,有1,2,3,4,5个状态值,分别表示未找到文件,安全性错误,读取中断,文件不可读,编码错误。

文件加载成功后,会触发load事件,如果已发生error事件,就不再触发load事件。

详解Js中文件读取机制的更多相关文章

  1. 详解js中的闭包

    前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...

  2. 详解js中的寄生组合式继承

    寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上.       2. ...

  3. 详解JS中DOM 元素的 attribute 和 property 属性

    一.'表亲戚':attribute和property 为什么称attribute和property为'表亲戚'呢?因为他们既有共同处,也有不同点. attribute 是 dom 元素在文档中作为 h ...

  4. 详解js中的apply与call的用法

    前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...

  5. 详解JS中Number()、parseInt()和parseFloat()的区别

    三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...

  6. 详解 JS 中 new 调用函数原理

    JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数),那在使用 new 调用一个函数的时候到底发生了什么?先看几个例子,再解释背后发生了什么. 1)看三个例子 1.1 ...

  7. 详解js中的this指向

    this指向问题是个老生常谈的问题了,现在我给大家一个例子 var obj={ bar:'Cynthia' , foo:function(){ console.log(this.bar,"w ...

  8. 详解JS中 call 方法的实现

    摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...

  9. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...

随机推荐

  1. mysql遇到锁表常用命令

    出现 waiting for table metadata lock 锁表的解决方法 1. show processlist; kill xxx; //xxx 为会话id 2.查询是否有未提交的事物 ...

  2. 《UNIX环境高级编程第三版》apue.h等源码文件的编译安装

    操作系统:Ubuntu 12/14 1.下载书中的源代码:点击下载 2.编译 tar -zxvf *.tar.gz cd ./apue.3e make 报错: can,t find -lbsd 解决办 ...

  3. CentOS 6.3 中安装VirtualBOX增强工具失败:Building the main Guest Additions module[FAILED]

    在VirtualBox里安装CentOS系统,会遇到“增强工具”无法正常安装,主要的原因是出在Kernel 库找不到. 错误提示如下:  通过查看日志文件: cat /var/log/vboxadd- ...

  4. java基础 作业(一)

    题目: 跳水比赛,8个评委打分.运动员的成绩是8个成绩去掉一个最高分,去掉一个最低分,剩下的6个分数 的平均分就是最后 得分.使用以为数组实现打分功能 .请把打分最高的评委和最低的评委找出来. 解析: ...

  5. ReflectionToStringBuilder类

    ReflectionToStringBuilder类是用来实现类中的toString()方法的类,它采用Java反射机制(Reflection),通过reflection包中的AccessibleOb ...

  6. Angular2 指令

      1. 指令说明 Angular2 指令是构成Angular2应用程序的重要组成部分,指令主要用来对模板的标签或者元素附加一些新的特性或者功能,改变一个 DOM 元素的外观或行为,Angular2指 ...

  7. Oracle 过程中检查数据表存在与否

    在过程中,尤其是每天执行的任务,通常要检查查询的数据表存在不存在,如果不存在则等待一段时间在进行执行,以下代码实现了这个功能,如果表不存在,抛出异常,交给异常处理代码,确保数据完整性 使用方法:p_C ...

  8. 设置windows开机自启某个软件

    位置:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 把要启动的软件,放在这个 ...

  9. 【原创】js中input type=file的一些问题

    1.介绍 在开发中,文件上传必不可少,input[type=file] 是常用的上传标签,但是它长得又丑.浏览的字样不能换,但是他长得到底有多丑呢.我们来看看在不同浏览器里的样子吧. <inpu ...

  10. 怎么在myeclipse中导入已经写好的项目

    经常我们需要学习别人写好了的源码来提升自己的编码能力,本文将介绍如何从外部导入别人已经写好的项目到我们myeclipse里面.同时也将介绍怎么给导入的工程改名的问题.                 ...