js读取本地文件的实例


Posted in Javascript onDecember 22, 2017

如何用在浏览器端预览本地文件?

今天的主题是使用浏览器预览本地文件。

由于浏览器安全策略的限制,javascript程序不能自由地访问本地资源,这是对用户信息安全来说,是一项不得不遵守的准则。假如网络上的javascript程序可以自如地访问用户主机的本地资源,那么浏览器用户将毫无安全可言。尽管有这个安全限制,但是在得到用户允许的情况下,浏览器还是可以访问本地资源的。

获得用户允许的方法就是通过标签来让用户手动选择文件,这一过程就是用户授予访问权限的过程。然后 使用获得File 对象通过URL.createObjectURL(file)转换为文件url, 就可以传递给类似y于img,video,audio等标签使用了。我将本地文件转换为url 的功能封装成了一个类。

function LocalFileUrl(){
 var _this = this;
 this.input_id = 'input_getLocalFile'+ Math.round(Math.random() * 1000);
 $("body").append("<input type='file' style='display:none' id='"+this.input_id+"' multiple>");
 this.urls=[];
 var _this = this;
 $("#" + this.input_id).change(function(e){
  console.log("change");
  //如果_this.urls 不为空,则释放url
  if(_this.urls){
   _this.urls.forEach(function(url,index,array){
    URL.revokeObjectURL(url.url);//一经释放,马上将无法使用这个url的资源
   });
   _this.urls = [];
  }
  $(this.files).each(function(index,file){
   var url = URL.createObjectURL(file);
   _this.urls.push({url:url,file:file});
  });
  typeof _this.getted == 'function' && _this.getted(_this.urls);
 })
}
/*
参数说明:getted:function(urls){}
urls是一个url对象数组。[url]
url = {
url:url, //选取的文件url
file:file //选取的文件对象引用
}
*/
LocalFileUrl.prototype.getUrl = function(getted){
 this.getted = getted;
 $("#"+ this.input_id).click();
}

使用方法:

var localFileUrl = new LocalFileUrl();//实例化对象
//触发读取,弹出文件选择框,并且监听文件选择事件。  
localFileUrl.getUrl(function(urls){
 urls.forEach(function(item,index,array){
  $("body").append("<div>"+index+"----"+item.url+"</div>")
 })
})

使用jQuery 的promise对象改写

这种方式的好处是可以使用链式写法,并且可以绑定多个done事件处理函数,执行顺序按照绑定顺序。

function LocalFileUrl(){
 this.dtd ={};
 this.input_id = 'input_getLocalFile'+ Math.round(Math.random() * 1000);
 $("body").append("<input type='file' style='display:none' id='"+this.input_id+"' multiple>");
 this.urls=[];
 var _this = this;
 $("#" + this.input_id).change(function(e){
  //如果_this.urls 不为空,则释放url
  if(_this.urls){
   _this.urls.forEach(function(url,index,array){
    URL.revokeObjectURL(url.url);//一经释放,马上将无法使用这个url的资源
   });
   _this.urls = [];
  }
  $(this.files).each(function(index,file){
   var url = URL.createObjectURL(file);
   _this.urls.push({url:url,file:file});
  });
  //传入一个可选的参数数组
  _this.dtd.resolveWith(window,new Array(_this.urls));
 })
}
/*
返回一个jquery 的promise 对象,可以绑定done()事件。done(urls)接收一个urls数组
{
 url:url,
 file:file// 选取的文件对象
}
*/
LocalFileUrl.prototype.getUrl = function(){
 this.dtd = $.Deferred();
 $("#"+ this.input_id).click();
 return this.dtd.promise();
}

使用方式

var localFilrUrl = new LocalFileUrl();
// 绑定done事件
localFileUrl.getUrl().done(function(urls){
 urls.forEach(function(item,index,array){
  $("body").append("<div>"+index+"----"+item.url+"</div>")
 })
}).done(function(){
 console.log("完成");
}).done(function(){
 alert("已经读取了本地文件路径");
})

兼容性

URL.createObjectURL(File/Blob)是一个实验性的功能。IE10及以上版本兼容。与之对应的是URL.revokeObjectURL(url),它用来告诉浏览器已经不需要这个url的引用了,可以释放掉了。一经调用,这个url立即失效。

Javascript 相关文章推荐
JavaScript监测ActiveX控件是否已经安装过的代码
Sep 02 Javascript
JavaScript插入动态样式实现代码
Feb 22 Javascript
浅谈Javascript鼠标和滚轮事件
Jun 27 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
javascript实现Table排序的方法
May 15 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
Sep 25 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
Oct 20 Javascript
VeeValidate 的使用场景以及配置详解
Jan 11 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
react基本安装与测试示例
Apr 27 Javascript
JavaScript流程控制(循环)
Dec 06 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 #Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 #Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 #Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 #Javascript
JavaScript实现单例模式实例分享
Dec 22 #Javascript
vue使用axios时关于this的指向问题详解
Dec 22 #Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 #Javascript
You might like
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Django中Forms的使用代码解析
2018/02/10 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
深入浅析Python代码规范性检测
2020/07/31 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
绿色环保演讲稿
2014/05/10 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
安全生产先进个人总结
2015/02/15 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫