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与函数式编程解释
Apr 27 Javascript
javascript比较文档位置
Apr 08 Javascript
js身份证验证超强脚本
Oct 26 Javascript
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
关于onchange事件在IE和FF下的表现及解决方法
Mar 08 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
javascript日期处理函数,性能优化批处理
Sep 06 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
Aug 07 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
我常用的几个类
2006/10/09 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
Vue实现购物车详情页面的方法
2019/08/20 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
Python对数据库操作
2016/03/28 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
Django 拆分model和view的实现方法
2019/08/16 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
python日志模块logbook使用方法
2019/09/19 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
诚信考试标语
2014/06/24 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
大学同学聚会感言
2015/07/30 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL