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 相关文章推荐
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
js对数字的格式化使用说明
Jan 12 Javascript
js Html结构转字符串形式显示代码
Nov 15 Javascript
AngularJS ng-app 指令实例详解
Jul 30 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
使用vue-cli编写vue插件的方法
Feb 26 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
解决百度Echarts图表坐标轴越界的方法
Oct 17 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
Vue-cli3项目引入Typescript的实现方法
Oct 18 Javascript
关于JavaScript 中 if包含逗号表达式
Nov 27 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
PHP的简易冒泡法代码分享
2012/08/28 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Django Admin实现上传图片校验功能
2016/03/06 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
广告学专业推荐信范文
2013/11/23 职场文书
python 提取html文本的方法
2021/05/20 Python