在JavaScript中进行文件处理,第一部分:基础
译注:原文是《JavaScript高级程序设计》的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考。原文链接:这里
很多年前,我在一次Goole面试被问到,如何在web应用中提供更好的用户体验。浮现在我脑海里的第一个想法是,通过比<input type="file">标签更好的方式来进行文件操作。虽然web发展一路高歌猛进,但自从该标签引进以来,我们操作文件的方式就一直使用它而从来没有改变过。幸运的是,有了HTML5和相关API,我们在最新版本的浏览器上可以有更多的方式进行文件操作(iOS 仍然不支持File的API)。
File 类型
File类型在File的API[1]中有详细定义,是一个文件的抽象表征。每个File实例有如下几个属性:
- name – 文件名
- size – 文件的二进制大小
- type – 文件的MIME类型
一个File对象是在不直接访问文件内容的情况下,给你文件的基本信息。这一点很重要,因为从磁盘上读取文件内容,视乎文件的大小,如果文件很大,可能会在读取上等待很长时间。File对象只是一个文件的引用,和获取文件内容是两个独立的过程。
获取文件引用
基于安全的考虑,访问用户文件是严格禁止的,你不希望在加载某个页面时页面自动扫描你的硬盘然后把你的文件罗列出来吧?你访问用户电脑上的文件时要经过他们的许可,在想象中会弹出授权窗口给用户进行确认,但当用户通过页面上载东西时,实际上已经授权页面可以一直访问文件,所以不会弹出那些杂乱无章的授权窗口。
当你使用<input type="file">标签时,你已经授权web页面(或者服务器)去访问该文件,通过<input type="file">标签去检索到文件对象。
HTML5为所有<input type="file">标签定义了一个文件集属性FileList,是一个类型数据类型的的数据结构,包含了每一个被选中的文件(HTML5允许多文件选择操作)。所以无论何时,你都可以使用以下代码来访问用户选择的文件。
1 |
|
这段代码监听了文件操作的change事件,一旦change事件触发,表示选中的文件已经发生改变,然后程序会迭代输出每个File对象的信息。记住,始终是通过javascript来访问文件的属性,所以不会有读取文件内容的动作。
拖拽文件
在表单中进行文件访问,需要用户先浏览查询再选中所需的文件。幸运的是,HTML5的拖拽功能[2]给用户提供了另外一种方式去授权需要访问的文件:通过简单的将文件从本地拖拽到浏览器。要实现这个功能你只需监听2个事件。
为了读取从某些区域拖拽到浏览器的文件,你需要监听dragover和drop事件,并取消它们原有的默认行为。做这些是为了告诉浏览器无需处理,你可以直接处理这些动作,例如,打开一个图像文件。
1 |
|
event.dataTransfer.files是另外一个文件集合对象,你可以从中获取文件信息。这段代码的功能等同于你手工选择打开一个文件。
Ajax文件上传
一旦你有了一个文件的引用,你可能会做一些非常酷的事情,比如用Ajax上传文件。由于XMLHttpRequest Level 2[3]的FormData对象,使得这完全有可能。这个对象表示一个HTML表单,并且允许你在里面通过append方法来添加键值对数据,然后提交到服务器。
1 |
|
FormData的伟大之处在于它可以直接添加一个文件对象,从而有效地模仿表单的文件上传。你所需要做的仅仅是添加一个File引用,并且指定一个文件名,剩下的由浏览器全部搞定。例如:
1 |
|
一旦FormData对象被传递到send方法,适当的HTTP头将会为你设置好。你不需要担心使用文件的表单如何设置正确的编码格式,服务器会将其当作一个常规的HTML表单来提交,然后读取“photo”键的文件数据和“name”键的文本数据。这让你在写后台代码时可以很自由,很容易的处理表单数据,不管是传统HTML表单还是Ajax表单形式。
所有这些都可以在最新版本的浏览器上工作,包括IE10。
下集预告
你现在知道两种在浏览器中访问文件信息的方法,一种是通过文件上传操作,一种是通过本地的拖拽操作。未来可能有其他的方法,但现在你只需要了解这两种就好了。当然,读取文件信息只是问题的一部分,下一步是如何读取文件的内容,这将在第二部分做讲解。
相关链接:
在JavaScript中进行文件处理,第一部分:基础的更多相关文章
- 在JavaScript中进行文件处理,第五部分:Blobs
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 到目前为止,这个系列的帖子集中在和这些文件交互- ...
- 在JavaScript中进行文件处理,第二部分:文件读取
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 在我的前一篇blog中,我介绍了在JavaScr ...
- 在JavaScript中进行文件处理,第三部分:处理事件和错误
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 FileReader对象用来读取浏览器可以访问的 ...
- javascript中关于日期和时间的基础知识
× 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...
- 在JavaScript中进行文件处理,第四部分:对象URLs
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 学习到这里,你已经了解在传统方式中如何使用文件, ...
- javaScript中利用ActiveXObject来创建FileSystemObject操作文件
注:如果用javascript读本地文件,遇到安全问题. 需在浏览器中进行设置,如下: 工具—> Internet选项->安全->自定义级别->启用“没有标识为安全的A ...
- JavaScript中ActiveXObject操作本地文件夹
在Windows平台上, js可以调用很多Windows提供的ActivexObject,本文就使用js来实现文档处理, 和使用js编写ActiveX做一个简单介绍. <!DOCTYPE HTM ...
- JavaScript中使用ActiveXObject操作本地文件夹的方法
转载地址 http://www.jb51.net/article/48538.htm 在Windows平台上, js可以调用很多Windows提供的ActivexObject,本文就使用js来实 ...
- JavaScript中ActiveXObject对象
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用.使用方法: newObj = new ActiveXObject( servername.typen ...
随机推荐
- cocos2d 特效
一.特效概念 特效是让精灵(CCSprite)执行某种特殊的效果.其实,特效也是一种动画! 但是,为什么要把特效与动画区分呢?因为,特效是基于网格属性来进行的. 如何区分动画与特效?简单的将,当使用到 ...
- MySQL中数据表的查操作
查询数据表的全部内容 mysql> show tables;#查看当前数据库下的全部表 +--------------------+ | Tables_in_ceshi_ku | +------ ...
- C#知识点备忘
1.结构体不能用判断符号==判断是否为null,结构体是值类型,不论采用new与否,结构体中的值类型都已经赋了初值. 2.整数相除: a=; b=: c=a/b; 结果c= 如果想得到double型需 ...
- Centos7 Zabbix3.2安装
实验环境: 阿里云 [zabbix@miyan ~]$ cat /etc/redhat-release CentOS Linux release (Core) 不得不说,官方文档确实强大 1.官方文档 ...
- CCF地铁修建
问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...
- Vue学习笔记之Nodejs中的NPM使用
0x00 NPM是什么 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 0x01 NPM安装 傻瓜式的安装. 第一步:打开 ...
- 从0开始学习 GITHUB 系列之「团队合作利器 BRANCH」【转】
本文转载自:http://stormzhang.com/github/2016/07/09/learn-from-github-from-zero6/ 版权声明:本文为 stormzhang 原创文章 ...
- UVA 257 Palinwords(hash)题解
思路:给你字符串,如果他包含至少两个长度大于等于3的回文,并且这些回文不能嵌套(例如aaa嵌套在aaaa,waw嵌套在awawa),如果这个字符串这么牛逼的话,就输出他. 思路:拿到字符串先正序has ...
- 获取lambda表达式类型,获取attributes是注意事项
1.获取lambda表达式的MemberExpression所属类的类型,要使用:m.Expression.Type 而不要使用 m.Member.DeclaringType: 后者获取的是实际定 ...
- POJ 1034 The dog task(二分图匹配)
http://poj.org/problem?id=1034 题意: 猎人和狗一起出去,狗的速度是猎人的两倍,给出猎人的路径坐标,除了这些坐标外,地图上还有一些有趣的点,而我们的狗,就是要尽量去多的有 ...