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实现HTML5 Canvas六种特效滤镜示例
Jun 28 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
有关json_decode乱码及NULL的问题
Oct 13 Javascript
js右下角弹出提示框示例代码
Jan 12 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
Angular 4依赖注入学习教程之简介(一)
Jun 04 Javascript
JS实现的简单四则运算计算器功能示例
Sep 27 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
Apr 13 Javascript
Vue自定义弹窗指令的实现代码
Aug 13 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
js 中的switch表达式使用示例
2020/06/03 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
微信跳一跳python代码实现
2018/01/05 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
用Python实现读写锁的示例代码
2018/11/05 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
如何获取Python简单for循环索引
2019/11/21 Python
Python如何给函数库增加日志功能
2020/08/04 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
销售部主管岗位职责
2013/12/18 职场文书
初中家长寄语
2014/04/02 职场文书
纪检监察建议书
2014/05/19 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
篮球比赛口号
2014/06/10 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫