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 解析读取XML文档 实例代码
Jul 07 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
JavaScript 函数的执行过程
May 09 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 Javascript
详谈js模块化规范
Jul 07 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
详解如何在你的Vue项目配置vux
Jun 04 Javascript
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
Vue.extend 编程式插入组件的实现
Nov 18 Javascript
JS函数本身的作用域实例分析
Mar 16 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
将PHP作为Shell脚本语言使用
2006/10/09 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
js格式化时间的方法
2015/12/18 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
JS实现数组的增删改查操作示例
2018/08/29 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
PHP笔试题
2012/02/22 面试题
毕业生自我鉴定范文
2013/11/08 职场文书
税务专业毕业生自荐信
2013/11/10 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
关于环保的建议书
2014/05/12 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
质检员岗位职责范本
2015/04/07 职场文书
公司仓库管理制度
2015/08/04 职场文书
建房合同协议书
2016/03/21 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
Python利器openpyxl之操作excel表格
2021/04/17 Python
Mysql 如何查询时间段交集
2021/06/08 MySQL