JavaScript File API文件上传预览


Posted in Javascript onFebruary 02, 2016

对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情,通常我们能做的仅仅是使用<input type="file">标签来上传文件。实现过程是:选取文件的时候value 属性保存了用户指定的文件的名称,表单被提交的时候,浏览器会向服务器发送选中的文件的内容而不仅仅是发送文件名。再获取服务器返回的地址,然后做预览。

但是如果有一天我们要上传一个图片,传了图片后预览想换另一张图片,就又得先上传到服务器再预览。在网络比较慢的情况下,这样真的很折腾。

所以我们某些时候需要先预览再上传到服务器,特别是一些有剪切功能的需求,例如新浪微博的头像更换。但是目前能做的只能是借助插件开发或者使用flash,由于不同浏览器的技术实现不尽相同,为了让程序能够支持多浏览器,我们的程序就会变得十分复杂而难于维护。幸好现在有了File API

通过监听change事件我们可得知用户选择的文件,并且添加了一个files集合,集合中将包含file对象,每个file对象对应着一个文件。并且都有以下只读属性name,size,type,lastModifiedDate.

<input type="file" name="file">为例,监控onchange事打印它的file对象:

JavaScript File API文件上传预览

由此我们可得知用户选取的文件格式,文件名以及文件大小等等的一些信息。因此我们很容易就能为所选取的文件作验证判断是否符合我们定的一些要求。

除此之外File API还提供了FileReader类型读取文件中的数据。

FileReader类型实现的事一种异步文件读取机制,类似于XMLHttpRequest,但是它读的是文件系统而不是远程服务器。并且提供了几种读取方法:

  • readAsText(file,encoding):以纯文本形式读取文件,将读取到的文本保存在result属性中,第二个参数用于指定编码类型,可选。
  • readAsDataURL(file):读取文件以数据URL的形式保存在result属性中。
  • readAsBinaryString(file):读取文件并将一个字符串保存在result属性中。
  • readAsArrayBuffer(file):读取文件并将一个包含文件人容的ArrayBuffer保存在result属性中

通过以上方法分别读取同一张本地图片,并且把保存在result属性中的信息打印出来对比如下:

readAsText(file,encoding):

JavaScript File API文件上传预览

readAsDataURL(file):

JavaScript File API文件上传预览

通过以上对比我们发现这些读取文件的方法为灵活的处理文件数据提供了极大的方便。例如读取图像文件并且保存为数据url,可以做上传前的预览功能。

由于读取的过程是异步的,所以FileReader里面有几个事件分别处理不同的情况:progress(是否读取了新数据)、erro(是否发生了错误)、load(是否已经读完了整个文件)。

由于种种原因无法读取文件就会触发error事件,触发error事件的时会有一个属性code(错误码)保存在FileReader的error属性里面的一个对象中。

使用FileReader做上传预览的例子:

HTML:

<label class="item_label">上传照片:
 <span style="width: 100px; height: 100px;border:1px solid #ccc; display:inline-block"><img src="#" id="uploadPreview" style="width: 100%; height: 100%;"></span>
 <input type="file" name="file" id="postFile" style="width:74px;">
 <span id="error_text" style="display: none;">提示</span>
</label>

JavaScript:

document.getElementById('postFile').onchange = function() {
 var val = this.value;
 var upLoadType = '.jpg,.gif,.bmp,.png';//['.jpg','.gif','.bmp','.png']; //可上传的格式
 var fileExt = val.substr(val.lastIndexOf(".")).toLowerCase(); //从字符串中抽出最后一次出现.之后的字符,并且转换成小写
 var result = upLoadType.indexOf(fileExt); //查找后缀名是否符合条件,如果符合返回>=0,如果不符合则返回负数;
 _alertMsg = $('#error_text');
 var oFReader = new FileReader();
 if (this.files.length === 0) { return; }
 var oFile = this.files[0]; //如果只有一个文件则只需要访问这个FileList对象中的第一个元素.
  
 if (oFile.size / 1024 < 100) {
  _alertMsg.html("<font style='color:blue'>√</font>").show()
 };
 if (result < 0) {
  _alertMsg.html("请输入正确格式:" + upLoadType).show();
 } else{
  _alertMsg.html("<font style='color:blue'>√</font>").show();
 };
 
 oFReader.readAsDataURL(oFile); // 开始在后台进行读取操作。当图像文件的所有内容加载后,他们转换成一个data:URL,传递到onload回调函数中
 oFReader.onload = function (oFREvent) { //当读取操作成功完成时调用.
  document.getElementById("uploadPreview").src = oFREvent.target.result;
 };
};

效果以及返回的图片URL:

JavaScript File API文件上传预览

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
创建你的第一个AngularJS应用的方法
Jun 16 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
jquery获取下拉框中的循环值
Feb 08 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
spring+angular实现导出excel的实现代码
Feb 27 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
JavaScript实现简单计算器功能
Dec 19 Javascript
解决Nuxt使用axios跨域问题
Jul 06 Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 #Javascript
Webwork 实现文件上传下载代码详解
Feb 02 #Javascript
javascript自动切换焦点控制效果完整实例
Feb 02 #Javascript
原生js实现图片层叠轮播切换效果
Feb 02 #Javascript
Javascript实现的SHA-256加密算法完整实例
Feb 02 #Javascript
JavaScript实现的SHA-1加密算法完整实例
Feb 02 #Javascript
javascript实现瀑布流加载图片原理
Feb 02 #Javascript
You might like
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
js过滤数组重复元素的方法
2010/09/05 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
react实现菜单权限控制的方法
2017/12/11 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
微信小程序实现购物车小功能
2020/12/30 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
Python递归实现打印多重列表代码
2020/02/27 Python
竞选班长演讲稿
2013/12/30 职场文书
个人自我鉴定总结
2014/03/25 职场文书
一体化教学实施方案
2014/05/10 职场文书
建筑安全员岗位职责
2015/02/15 职场文书