WEB 프런트엔드에서 ZIP 패키지 압축 해제
zip 파일의 압축을 풀기 위해 웹 프런트엔드를 사용하는 방법:
표준 브라우저만 고려한다면 서버는 압축된 패키지만 클라이언트에 전송하면 되므로 대역폭과 전송 시간이 절약됩니다.
프런트엔드 코드가 많고 큰 그림이 포함된 경우 js, css, jpg, png 등 다양한 데이터를 서버를 통해 zip으로 압축하여 브라우저로 보낼 수 있습니다. . CSS 실용 역학 DOM을 생성하고 삽입하며, js도 globalEval을 사용하여 직접 실행되며, 다양한 jpg 또는 png 이미지 파일이 Blob 스트림에서 이미지로 변환되어 브라우저에 직접 삽입됩니다.
HTML5는 Blob(이진 대형 개체, 파일 파일도 Blob을 상속함) 읽기를 지원하고 이를 이미지 스트림, 텍스트 스트림 또는 기타 스트림 형식으로 변환합니다. 이것이 바로 브라우저가 "application/zip" 파일을 읽을 수 있는 이유입니다.브라우저에서 zip 파일의 압축을 풀려면 UnZipArchive.js가 zip.js, mime-type.js 및 jquery.js에 의존하기 때문에 4개의 j를 도입해야 합니다.
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="http://gildas-lormeau.github.io/zip.js/demos/zip.js"></script> <script src="http://gildas-lormeau.github.io/zip.js/demos/mime-types.js"></script> <script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script> <script src="http://files.cnblogs.com/files/diligenceday/UnZipArchive.js"></script> </head> <body> <h2> demo </h2> <div> <input type="file" id="file"> </div> <ul id="dir"> </ul> <script> $("#file").change(function (e) { var file = this.files[0]; window.un = new UnZipArchive( file ); un.getData( function() { //获取所以的文件和文件夹列表; var arr = un.getEntries(); //拼接字符串 var str = ""; for(var i=0; i<arr.length; i++ ) { //点击li的话直接下载文件; str += "<li onclick=download('"+arr[i]+"')>"+arr[i]+"</li>" }; $("#dir").html( str ); }); }); var download = function ( filename ) { un.download( filename ); }; </script> </body> </html>UnzioarichiveJS는 자체적으로 캡슐화되어 있습니다. 궁금한 점이 있으면 시간 내에 피드백을 보내주세요.
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="http://gildas-lormeau.github.io/zip.js/demos/zip.js"></script> <script src="http://gildas-lormeau.github.io/zip.js/demos/mime-types.js"></script> <script src="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> <input type="file" id="file"> </div> <ul id="dir"> </ul> <script> $("#file").change(function (e) { var file = this.files[0]; window.un = new UnZipArchive( file ); un.getData( function() { var arr = un.getEntries(); var str = ""; for(var i=0; i<arr.length; i++ ) { str += "<li onclick=download('"+arr[i]+"')>"+arr[i]+"</li>" }; $("#dir").html( str ); }); }); var download = function ( filename ) { un.download( filename ); }; </script> </div> <script> zip.workerScriptsPath = "http://gildas-lormeau.github.io/zip.js/demos/"; /** * @desc 解压缩文件的类; * @return UnZipArchive 的实例; * */ var UnZipArchive = function( blob ) { if( !blob ) { alert("参数不正确, 需要一个Blob类型的参数"); return ; }; if( !(blob instanceof Blob) ) { alert("参数不是Blob类型"); return ; }; function noop() {}; this.entries = {}; this.zipReader = {}; var _this = this; this.length = 0; this.onend = noop; this.onerror = noop; this.onprogress = noop; //创建一个延迟对象; var def = this.defer = new $.Deferred(); zip.createReader( new zip.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) { var f = new FileReader(); f.onload = function(e) {callback( e.target.result );}; f.readAsDataURL(blob); }; $.extend( UnZipArchive.prototype, { /** * @desc 获取压缩文件的所有入口; * @return ArrayList; * */ "getEntries" : function() { var result = []; for(var i= 0, len = this.entries.length ; i<len; i++ ) { result.push( this.entries[i].filename ); } return result; }, /** * @desc 获取文件Entry; * @return Entry * */ "getEntry" : function ( filename ) { var entrie; for(var i= 0, len = this.entries.length ; i<len; i++ ) { if( this.entries[i].filename === filename) { return this.entries[i]; }; } }, /** * @desc 下载文件 * @param filename; * @return void; * */ "download" : function ( filename , cb , runoninit) { var _this = this; this.defer = this.defer.then(function() { var def = $.Deferred(); if(!filename) return ; if(runoninit) { return runoninit(); }; var entry = _this.getEntry( filename ); if(!entry)return; entry.getData(new zip.BlobWriter(zip.getMimeType(entry.filename)), function(data) { if( !cb ) { UnZipArchive.readBlobAsDataURL(data, function( dataUrl ) { var downloadButton = 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 ); } }); return def; }); }, /** * @desc 获取对应的blob数据; * @param filename 文件名; * @param callback回调, 参数为 blob; * @desc 或者可以直接传一个函数作为zip解压缩完毕的回调; * */ "getData" : function ( filename, fn ) { if( typeof filename === "string") { this.download(filename, function( blob ) { fn&&fn( blob ); }); }else if( typeof filename === "function") { this.download("test", null, function( blob ) { filename(); }); }; }, "error" : function() { this.onerror( this ); throw new Error("压缩文件解压失败"); } }); </script> </body> </html>하지만 브라우저 호환성이 큰 문제입니다.