在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 ...
随机推荐
- Linux 系统默认运行级别设定
#vi /etc/inittab,将 id:5:initdefault: 改为 id:3:initdefault: Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不 ...
- Mysql中datetime和timestamp区别
DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...
- Spark Streaming里面使用文本分析模型
功能:接收来自kafka的数据,数据是一篇文章,来判断文章的类型,把判断的结果一并保存到Hbase,并把文章建立索引(没有代码只有一个空壳,可以自己实现,以后有机会了可能会补上) import org ...
- ruby md5 sha1 base64加密
#md5加密 require 'md5' puts MD5.hexdigest('admin') #sha1加密 require 'digest/sha1' puts Digest::SHA1.hex ...
- MFC中利用GDI+进行双缓冲作图的有关设置
这里只是在遇到实际问题的时候提出的一种解决方法,用以处理闪屏问题. 首先要做的是对GDI的一个设置问题: 在应用程序类中添加一个保护权限数据成员 class C...App: {... private ...
- 使用ffmpeg进行网络直播
一.采集:使用python调用摄像头采集,原设想是使用树莓派摄像头采集,但是经费紧张买不起,先用摄像头凑合下,反正很简单. 原理就是先录一小段视频,然后循环播放,用 ...
- C#反射——模仿ParameterInterceptor(ashx处理程序)
反射工具类请参见:https://www.cnblogs.com/threadj/p/10535796.html using System; using System.Collections.Gene ...
- python3的一些练习题
下面是最近写的一些python3版本的一些练习题: 1.4+44+444+4444+.....+=? root@wadeson:~/study_for_python/homework# cat aa. ...
- 20145325张梓靖 《Java程序设计》第16周课程总结
20145325张梓靖 <Java程序设计>第16周课程总结 实验报告链接汇总 实验一 "Java开发环境的熟悉" 实验二 "Java面向对象程序设计&quo ...
- QT+qtablewidget自定义表头【合并单元格】
1.把下列文件放在工程中[已上传到我的文件中] 2.代码 auto *headview = new HHeadViewClass(Qt::Horizontal, ui.tableWidget); he ...