在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)执行某种特殊的效果.其实,特效也是一种动画! 但是,为什么要把特效与动画区分呢?因为,特效是基于网格属性来进行的. 如何区分动画与特效?简单的将,当使用到 ...
- tobii SDK开发学习
最近实验室用到tobii的眼动仪,从网上了解了下,tobii是瑞典的眼跟踪技术开发商,今年似乎有上市计划,不知道市值多少 买了仪器后试用了下,还算可以,将来配合人体设备开发,不过配套软件还需要花钱买. ...
- Java Thread 如何处理未捕获的异常?
Java Thread是不允许异常抛出到本线程之外的,Runnable接口的public abstract void run()是不允许throws Exception的,这在编译时就通不过. 线程异 ...
- LockSupport HotSpot里park/unpark的实现
每个java线程都有一个Parker实例,Parker类是这样定义的: class Parker : public os::PlatformParker { private: volatile int ...
- 记一次mysql启动不了的问题
在linux上用的是xampp,mysql启动没有报任何错误,但就是查找不到进程,于是找mysql错误日志,日志在哪?在lampp/var/mysql 以.err结尾的文件里.里面内容如下; /opt ...
- NodeJS学习笔记四
Generator简介 基本概念 Generator函数有多种理解角度.从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历 ...
- cocos代码研究(21)Widget子类TextField学习笔记
基础理论 一个接受用户输入的widget. 输入文本的渲染基于TextFieldTTF. 如果你想用系统控制行为,请使用EditBox来替代.继承自 Widget. 代码实践 //与占位符有关void ...
- Linux 中的 Service
参考: cnblogs.com/xiaofan21 - linux service和daemon cnblogs.com/xuange306 - linux service命令常见使用方法 cnblo ...
- 逆向及BOF基础实践
逆向及BOF基础实践 20145316 许心远 一.缓冲区溢出基础知识 缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统宕机 ...
- 20145301赵嘉鑫《网络对抗》逆向及Bof基础
20145301赵嘉鑫<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...