上篇文章中,我介绍了在JavaScript操作文件,重点讲了如何取得File对象。 这些对象包含的文件的元数据在上传或者拖放到浏览器中时可以获取到。有了文件当然接下来就是读取文件了。

FileReader

FileReader 功能很简单: 从文件中读取数据和保存到JS变量中。此API特意设计成跟XMLHttpRequest 一样因为都是从外部读取数据。读取过程都是异步的不会造成浏览器阻塞。

FileReader 可以返回几种格式来文件数据的格式, 而且这些格式在读取文件时是必须的。通过以下几个方法可以宣告读取完毕:

  • readAsText() – 返回文件内容的纯文本格式
  • readAsBinaryString() –返回文件内容的二进制格式 (不推荐– 推荐使用 readAsArrayBuffer())
  • readAsArrayBuffer() – 返回文件内容的 ArrayBuffer 格式(图片文件推荐使用)
  • readAsDataURL() – 返回文件内容的 data URL格式
 

这些格式都应在文件读取操作前初始化好比 XHR 对象的 send()方法前要初始化一个 HTTP 请求一样。同样的,开始读取之前你还是要监听 load 事件。读取的结果从 event.target.result 获取。例如:

1
2
3
4
5
6
7
8
9
10
11
var reader = new FileReader();
reader.onload = function(event) {
    var contents = event.target.result;
    console.log("File contents: " + contents);
};
 
reader.onerror = function(event) {
    console.error("File could not be read! Code " + event.target.error.code);
};
 
reader.readAsText(file);

以上示例将文件以纯文本输出。文件读取成功则执行 onload 方法否则执行 onerror 方法。 FileReader 的实例可以直接从event.target中取到而且推荐这么取而不是直接用 reader 变量.。 result 属性包含有文件的内容, success 和 error 包含有成功与失败的信息。

读取 data URIs

读取 data URI 的步骤大致相同。Data URIs (有时称 data URLs) 有时是个不错的选择,比如,直接显示从硬盘上读到的图片 ,案例参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var reader = new FileReader();
reader.onload = function(event) {
    var dataUri = event.target.result,
        img     = document.createElement("img");
 
    img.src = dataUri;
    document.body.appendChild(img);
};
 
reader.onerror = function(event) {
    console.error("File could not be read! Code " + event.target.error.code);
};
 
reader.readAsDataURL(file);

以上示例将读取的图片插入页面当中。由于data URI 包含有整个图片的内容,可以直接赋值给一个Image对象的src属性然后显示。你还能将图片直接画到 <canvas> 元素里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var reader = new FileReader();
reader.onload = function(event) {
    var dataUri = event.target.result,
        context = document.getElementById("mycanvas").getContext("2d"),
        img     = new Image();
 
    // wait until the image has been fully processed
    img.onload = function() {
        context.drawImage(img, 100, 100);
    };
    img.src = dataUri;
};
 
reader.onerror = function(event) {
    console.error("File could not be read! Code " + event.target.error.code);
};
 
reader.readAsDataURL(file);

以上示例将一个图片资源读入一个 Image 对象,然后将其画入一个canvas中(高宽各100)。

Data URIs 通常都这么用, 且可以用于任何类型的文件。最广泛的用法就是将文件一边读为data URI的同时一边在页面上即时显示。

读取 ArrayBuffers

ArrayBuffer 格式[1] 作为WebGL的一部分首次提出的。ArrayBuffer 表示将任意大小的字节数用一定的字节数来存储。此方式即是通过特定的视图来从 ArrayBuffer 读取数据,比如 Int8Array, 底层为 8 位有符号整型的集合,再如 Float32Array,  底层为32 位浮点数的集合。 这些谐称为类型化数组[2],这样容易迫使你使用一定的字节数来存储而不是无限字节数(即传统的数组)。

你可能将一个 ArrayBuffer 主要用于处理二进制的文件, 以便更细粒度的操作数据。在这里讨论 ArrayBuffer 的方方面面完全超出了的本文的范围,只要知道将文件读成 ArrayBuffer格式是非常简单的即可。你可随时将 ArrayBuffer 通过 XHR 对象的 send() 方法到服务器端 (然后在后端将数据重建),只要你的浏览器完整支持XMLHttpRequest Level 2[3] (各大浏览器的最新版都支持的包括IE10和Opera 12).

下期预告

通过FileReader 从文件中读取数据非常简单。如果你会用 XMLHttpRequest那么很容易学会从文件中读取数据。下期你将会学到更多 FileReader 相关事件和理解常见错误。

参考资料

  1. ArrayBuffer
  2. Typed Array Specification
  3. XMLHttpRequest Level 2

原文:

http://www.iunbug.com/archives/2012/06/04/220.html

可参考:

http://blog.csdn.net/zk437092645/article/details/8745647

[转]JavaScript文件操作(2)-FileReader的更多相关文章

  1. Javascript 文件操作(整理版)

    Javascript 文件操作 一.功能实现核心:FileSystemObject 对象 其实,要在Javascript中实现文件操作功能,主要就是依靠FileSystemobject对象.在详细介绍 ...

  2. File API文件操作之FileReader

    近来研究点对点的文件传输,想到一种方案FileReader+WebRtc. 当我看到FileReader的时候,哎呀,不错的东西啊,仔细一看属于File API,或者叫做Web API. File A ...

  3. File API文件操作之FileReader二

    上一篇说了FileAPI中FileReader的readAsText,这里继续上文,说说另外一个API readAsDataURL. 这个接口是将File或者Blob读成base64格式的字符串,然后 ...

  4. JavaScript文件操作(1)-基础

    http://www.iunbug.com/archives/2012/06/04/208.html

  5. JS读取文件,Javascript之文件操作 (IE)

    一.功能实现核心:FileSystemObject 对象      要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象. 二.FileSystemObject ...

  6. 廖雪峰js教程笔记14 file文件操作

    在HTML表单中,可以上传文件的唯一控件就是<input type="file">. 注意:当一个表单包含<input type="file" ...

  7. HTML5学习之文件操作(九)

    之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很进行跨平台的处理,另外就是让我们的web应用依赖了第三方的插件,而不是很独立 ...

  8. H5文件操作API

    引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨浏览器.跨设备等情况下实现统一的表现,从另外一个 ...

  9. HTML5文件操作API

    HTML5文件操作API       一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...

随机推荐

  1. hdu 4414 Finding crosses【简单模拟】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4414 CSUST:点击打开链接 Finding crosses Time Limit: 2000/1000 ...

  2. iOS 运行时详解

    注:本篇文章转自:http://www.jianshu.com/p/adf0d566c887 一.运行时简介 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行 ...

  3. vue介绍和简单使用

    Vue是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易 ...

  4. Java语言实现简单FTP软件------>源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  5. linux c编程:信号(四) sigaction

    signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受到了一定的限制.而 POSIX 标准定义的信号处理接口是 sigaction 函数, ...

  6. 【TFS】解决TFS编译中文乱码问题

    前言; TFS2018做程序集成非常方便,线上编译然后直接生成docker镜像,但是在使用过程中遇到编译窗口中文乱码的问题,这个问题找了好久没人知道怎么解决.如下: 这个问题不解决,每次编译失败,研发 ...

  7. linux基础part1

    linux基础部分一 一.linux简介 1.Linux的定义:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. ...

  8. git入门篇-----本地操作

    一 ,git的简介 1 ,git的历史 概念性的知识,大家百度一下,就会出现好多优秀的文章供参考,这里我就不多说了. 如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好 ...

  9. linux 指令(经常更新)

    添加一个服务 # sudo update-rc.d 服务名 defaults 99 删除一个服务 # sudo update-rc.d 服务名 remove 临时重启一个服务 # /etc/init. ...

  10. spring AOP简单实现代码存放

    @Before:使用Before增强处理只能在目标方法执行之前织入增强,如果Before增强处理没有特殊处理,目标方法总会自动执行,如果Before处需要阻止目标方法的执行,可通过抛出一个异常来实现. ...