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 相关文章推荐
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
Mar 06 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
javascript数据结构与算法之检索算法
Apr 04 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
Aug 24 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
Sep 28 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
Ajax实现页面无刷新留言效果
Mar 24 Javascript
Vue实现下拉加载更多
May 09 Vue.js
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循环输出数据库内容的代码
2008/05/24 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
js实现搜索栏效果
2018/11/16 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Spy++的使用方法及下载教程
2021/01/29 Python
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
2015元旦家电促销活动策划方案
2014/12/09 职场文书
中班下学期个人总结
2015/02/12 职场文书
办公室卫生管理制度
2015/08/04 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python