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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 Javascript
ie 调试javascript的工具
Apr 29 Javascript
一个js的tab切换效果代码[代码分离]
Apr 11 Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
深入理解JavaScript是如何实现继承的
Dec 12 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
基于bootstrap页面渲染的问题解决方法
Aug 09 Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 Javascript
JavaScript DOM常用操作代码汇总
Jul 03 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判断是否为json格式的方法
2014/03/04 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
js中replace的用法总结
2013/12/27 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python连接mongodb密码认证实例
2018/10/16 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
群众路线批评与自我批评
2014/02/06 职场文书
庆元旦活动总结
2014/07/09 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
怎样写观后感
2015/06/19 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
亲情作文之母爱
2019/09/25 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
Python利用folium实现地图可视化
2021/05/23 Python
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技