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 相关文章推荐
提高jQuery性能的十个诀窍
Nov 14 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 Javascript
简单说说如何使用vue-router插件的方法
Apr 08 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
Aug 08 Javascript
vue项目打包后请求地址错误/打包后跨域操作
Nov 04 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php中文验证码实现示例分享
2014/01/12 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
让Python更加充分的使用Sqlite3
2017/12/11 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
资产评估专业大学生求职信
2013/09/29 职场文书
历史学专业个人的自我评价
2013/10/13 职场文书
大学生专业个人学习的自我评价
2013/10/26 职场文书
生产主管岗位职责
2013/11/10 职场文书
建筑施工安全责任书
2014/07/24 职场文书
个人授权委托书模板
2014/09/14 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
纯html+css实现打字效果
2021/08/02 HTML / CSS
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android