javascript实现网页端解压并查看zip文件
WEB前端解压ZIP压缩包
web前端解压zip文件有什么用:
只考虑标准浏览器的话,服务器只要传输压缩包到客户端,节约了带宽,而且节约了传输时间,听起来好像很厉害的说;
如果前端的代码很多,而且包含大副的图片,那么就可以把js和css和jpg和png等各种数据通过服务端打包成zip传送到浏览器,浏览器负责解压,css实用动态生成插入到dom中,js也用globalEval直接执行,jpg或者png各种图片文件由blob流转化为image,直接插入到浏览器中;
html5支持读取Blob(二进制大对象,file文件也是继承了Blob),并转化为图片流或者文字流或者其他流格式,这也是为什么浏览器可以读取"application/zip"文件的原因;
要在浏览器中解压zip文件的话需要引入四个js,因为UnZipArchive.js依赖了zip.js,mime-type.js和jquery.js,测试demo如下:
<!DOCTYPEhtml> <html> <headlang="en"> <metacharset="UTF-8"> <title></title> <scriptsrc="http://gildas-lormeau.github.io/zip.js/demos/zip.js"></script> <scriptsrc="http://gildas-lormeau.github.io/zip.js/demos/mime-types.js"></script> <scriptsrc="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script> <scriptsrc="http://files.cnblogs.com/files/diligenceday/UnZipArchive.js"></script> </head> <body> <h2> demo </h2> <div> <inputtype="file"id="file"> </div> <ulid="dir"> </ul> <script> $("#file").change(function(e){ varfile=this.files[0]; window.un=newUnZipArchive(file); un.getData(function(){ //获取所以的文件和文件夹列表; vararr=un.getEntries(); //拼接字符串 varstr=""; for(vari=0;i<arr.length;i++){ //点击li的话直接下载文件; str+="<lionclick=download('"+arr[i]+"')>"+arr[i]+"</li>" }; $("#dir").html(str); }); }); vardownload=function(filename){ un.download(filename); }; </script> </body> </html>
UnzioarichiveJS是自己封装的,有任何问题的话请及时反馈
解压ZIP压缩包的完整DEMO
<!DOCTYPEhtml> <html> <headlang="en"> <metacharset="UTF-8"> <title></title> <scriptsrc="http://gildas-lormeau.github.io/zip.js/demos/zip.js"></script> <scriptsrc="http://gildas-lormeau.github.io/zip.js/demos/mime-types.js"></script> <scriptsrc="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script> <style> code{ display:block; padding:10px; background:#eee; } </style> </head> <body> <div> <h1> 兼容性 </h1> <div> <p> zip.js可以在所有的chrome浏览器和firefox浏览器中运行,可以在safari6和IE10,以及IE10以上运行; </p> <p> 如果要在IE9和safari中运行需要两个设置: </p> <code> 1:zip.useWebWorkers==false </code> <code> 2:并引用这个JS:https://bitbucket.org/lindenlab/llsd/raw/7d2646cd3f9b/js/typedarray.js </code> </div> <h2> demo </h2> <div> <inputtype="file"id="file"> </div> <ulid="dir"> </ul> <script> $("#file").change(function(e){ varfile=this.files[0]; window.un=newUnZipArchive(file); un.getData(function(){ vararr=un.getEntries(); varstr=""; for(vari=0;i<arr.length;i++){ str+="<lionclick=download('"+arr[i]+"')>"+arr[i]+"</li>" }; $("#dir").html(str); }); }); vardownload=function(filename){ un.download(filename); }; </script> </div> <script> zip.workerScriptsPath="http://gildas-lormeau.github.io/zip.js/demos/"; /** *@desc解压缩文件的类; *@returnUnZipArchive的实例; **/ varUnZipArchive=function(blob){ if(!blob){ alert("参数不正确,需要一个Blob类型的参数"); return; }; if(!(blobinstanceofBlob)){ alert("参数不是Blob类型"); return; }; functionnoop(){}; this.entries={}; this.zipReader={}; var_this=this; this.length=0; this.onend=noop; this.onerror=noop; this.onprogress=noop; //创建一个延迟对象; vardef=this.defer=new$.Deferred(); zip.createReader(newzip.BlobReader(blob),function(zipReader){ _this.zipReader=zipReader; zipReader.getEntries(function(entries){ _this.entries=entries; //继续执行队列; def.resolve(); }); },this.error.bind(_this)); }; /** *@desc把blob文件转化为dataUrl; **/ UnZipArchive.readBlobAsDataURL=function(blob,callback){ varf=newFileReader(); f.onload=function(e){callback(e.target.result);}; f.readAsDataURL(blob); }; $.extend(UnZipArchive.prototype,{ /** *@desc获取压缩文件的所有入口; *@returnArrayList; **/ "getEntries":function(){ varresult=[]; for(vari=0,len=this.entries.length;i<len;i++){ result.push(this.entries[i].filename); } returnresult; }, /** *@desc获取文件Entry; *@returnEntry **/ "getEntry":function(filename){ varentrie; for(vari=0,len=this.entries.length;i<len;i++){ if(this.entries[i].filename===filename){ returnthis.entries[i]; }; } }, /** *@desc下载文件 *@paramfilename; *@returnvoid; **/ "download":function(filename,cb,runoninit){ var_this=this; this.defer=this.defer.then(function(){ vardef=$.Deferred(); if(!filename)return; if(runoninit){ returnrunoninit(); }; varentry=_this.getEntry(filename); if(!entry)return; entry.getData(newzip.BlobWriter(zip.getMimeType(entry.filename)),function(data){ if(!cb){ UnZipArchive.readBlobAsDataURL(data,function(dataUrl){ vardownloadButton=document.createElement("a"), URL=window.webkitURL||window.mozURL||window.URL; downloadButton.href=dataUrl; downloadButton.download=filename; downloadButton.click(); def.resolve(dataUrl); _this.onend(); }); }else{ cb(data); def.resolve(data); } }); returndef; }); }, /** *@desc获取对应的blob数据; *@paramfilename文件名; *@paramcallback回调,参数为blob; *@desc或者可以直接传一个函数作为zip解压缩完毕的回调; **/ "getData":function(filename,fn){ if(typeoffilename==="string"){ this.download(filename,function(blob){ fn&&fn(blob); }); }elseif(typeoffilename==="function"){ this.download("test",null,function(blob){ filename(); }); }; }, "error":function(){ this.onerror(this); thrownewError("压缩文件解压失败"); } }); </script> </body> </html>
但是浏览器兼容又是大问题;