File对象

来源:互联网 发布:ubuntu怎么连接服务器 编辑:程序博客网 时间:2024/05/21 23:10

原文:http://blog.csdn.net/zhu1988renhui/article/details/7936498

【关于这个话题,网上已经有很多精华博客,发表博文,记录所学,扫盲的,仅供参考,转载请注明来源。】


         在做web文件上传时,如果是单文件上传,我们一般可以采用form表单的形式来上传文件。

这种做法用户体验非常的差,我们无法在客户端对用户选取的文件进行validate,无法读取文件大小,无法判断文件类型,无法预览等。。。

如果是多文件上传,js更是回天乏力,虽然也不是不能用js + iframe来模拟,但是很麻烦。。。

但现在有了HTML5,一切都不同!

html5提供了File API,允许js读取本地文件,但并不能直接访问本地文件,而是要依赖于用户行为,比如用户在type='file'控件上选择了某个文件或者用户将文件拖拽到浏览器上。

一、File Api 浏览器支持检测

         File Api给js提供了以下几个接口来访问本地文件系统“:

1、File- 单个文件;提供了诸如name、file size、mimetype等只读文件属性。

2、FileList- 一个类数组File对象集合;

3、Blob - 文件对象的二进制原始数据;

File API还提供了一个异步读取文件的接口 - FileReader。

[javascript] view plain copy
  1. if(window.File && window.FileReader && window.FileList && window.Blob) {  
  2.     document.write("Great success! All the File APIs are supported.");  
  3. else {  
  4.     document.write('The File APIs are not fully supported in this browser.');  
  5. }  
单击此处检测浏览器的支持情况>>
File API主要是用来获取本地文件系统中文件的reference,通过File API我们可以获得一个代表本地文件的js对象,而FileReader通过该File对象即可异步地读取本地文件的内容。

二、form表单的file控件

        在Html5中,file控件支持选择多个文件,用户选择了某些文件之后,html5为我们提供了一个访问这些文件的对象 - FileList,这是一个类数组集合,每一个元素为一个File对象,File对象中包含了文件的所有可访问信息。

示例的HTML代码如下:

[html] view plain copy
  1. <input type="file" id="Files" name="files[]" multiple />  
  2. <div id="Lists"></div>  

multiple属性指明了该file控件可进行多选操作。

js代码如下:

[javascript] view plain copy
  1. function fileSelect(e) {  
  2.     e = e || window.event;  
  3.        
  4.     var files = e.target.files;  //FileList Objects      
  5.     var output = [];  
  6.        
  7.     for(var i = 0, f; f = files[i]; i++) {  
  8.         output.push('<li><strong>' + f.name + '</strong>(' + f.type + ') - ' + f.size +' bytes</li>');  
  9.     }  
  10.        
  11.     document.getElementById('Lists').innerHTML = '<ul>' + output.join('') + '</ul>';  
  12.    
  13. }  
  14.    
  15. if(window.File && window.FileList && window.FileReader && window.Blob) {  
  16.     document.getElementById('Files').addEventListener('change', fileSelect, false);  
  17. else {  
  18.     document.write('您的浏览器不支持File Api');  
  19. }  

  由以上代码可以看到,html5为file这个dom元素新增了files接口(e.target指向了file input元素,实际上也可以用this来访问,即this.files),得到的就是FileList,通过遍历该集合,即可访问到各个已选择的文件对象。

NOTE:File对象还提供了文件的lastModifiedDate属性,不过测试了一下,火狐不支持。

单击此处查看demo>>

除了可以通过表单file控件访问本地文件外,还可以通过拖放API来访问。

三、Drag And Drop API

         html5还提供了一个更快捷的方式来触发读取文件的时机,前面我们已经说过,浏览器不能主动地访问本地操作系统,只能依赖于用户行为,用户想要访问文件时,才去访问本地文件系统。

         拖放API能做的事情很多,在这里我只介绍一下它在访问本地文件方面的功能。

示例代码:

[javascript] view plain copy
  1. function fileDrop(e) {  
  2.     e = e || window.event;  
  3.        
  4.     e.stopPropagation(); // 阻止冒泡  
  5.     e.preventDefault();  //阻止默认行为  
  6.        
  7.     var files = e.dataTransfer.files;   //FileList  
  8.        
  9.     var output = [];  
  10.        
  11.     for(var i = 0, f; f = files[i]; i++) {  
  12.         output.push('<li><strong>' + f.name + '</strong>(' + f.type + ') - ' + f.size +' bytes</li>');  
  13.     }  
  14.        
  15.     document.getElementById('Lists').innerHTML = '<ul>' + output.join('') + '</ul>';  
  16. };  
  17.    
  18. function dragOver(e) {  
  19.     e = e || window.event;  
  20.        
  21.     e.stopPropagation();  
  22.     e.preventDefault();  
  23.     e.dataTransfer.dropEffect = 'copy'//指定拖放视觉效果  
  24. };  
  25. var d = document.getElementById('DropZone');  
  26.    
  27. try {  
  28.     d.addEventListener('dragover', dragOver, false);  
  29.     d.addEventListener('drop', fileDrop, false)  
  30. catch(ex) {  
  31.     document.write('something must be wrong!');  
  32. }  

由以上代码可以看到,拖放api是以event对象的dataTransfer对象作为数据载体,该对象具有一个files属性,通过该属性,可以拿到我们想要的FileList集合。

点击此处查看拖放api示例>>

后面将介绍FileReader,通过它具体地读取文件内容。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 签证状态一直没有更新怎么办 简理财不能身份信息确认怎么办 德国领事馆没有收到预约邮件怎么办 父母一方带孩子英国签证怎么办 去韩国自由行签证怎么办 韩国自由行签证的该怎么办 法院离婚判决书没了怎么办 离婚判决书对方没收到怎么办 法院判离怎么办离婚证 判决书下来后没钱还怎么办 拿调解书怎么办离婚证 判决书生效后对方拒不履行怎么办 收到民事判决公告该怎么办 苹果手机gps信号弱怎么办 二审败诉后拿到判决书怎么办 农商行房贷逾期一天怎么办 农商行房贷逾期怎么办 农发行车改司机怎么办 混泥土地泵排量不稳怎么办 改嫁上海老公孩子的户口怎么办 给小孩办社保卡怎么办 有上海居住证积分怎么办医保 未办理居住证积分新生儿医保怎么办 厦门中考居住证没满三年怎么办 海归落户过了两年期怎么办 借呗学历填错了怎么办 上海落户应届生分不够怎么办 应届生落户分数不够72分怎么办? 上海应届生落户时间延误怎么办 南京市区户口签江宁怎么办 深圳公司集体户口离职后怎么办 济南本地户口不符合入学条件怎么办 上海住亲戚家怎么办居住证 政府卖非农户口怎么办 90年代买了户口怎么办 上海应届大学生积分不够怎么办 广州居住证回执单丢了怎么办 惠阳居住证回执单丢了怎么办 南京居住证换地方了怎么办 买家退回的商品有问题怎么办 农转农户口手续怎么办