javascript實(shí)現(xiàn)網(wǎng)頁(yè)端解壓并查看zip文件
WEB前端解壓ZIP壓縮包
web前端解壓zip文件有什么用:
只考慮標(biāo)準(zhǔn)瀏覽器的話, 服務(wù)器只要傳輸壓縮包到客戶端, 節(jié)約了帶寬, 而且節(jié)約了傳輸時(shí)間, 聽起來(lái)好像很厲害的說(shuō);
如果前端的代碼很多, 而且包含大副的圖片,那么就可以把js和css和jpg和png等各種數(shù)據(jù)通過(guò)服務(wù)端打包成zip傳送到瀏覽器, 瀏覽器負(fù)責(zé)解壓, css實(shí)用動(dòng)態(tài)生成插入到dom中,js也用globalEval直接執(zhí)行, jpg或者png各種圖片文件由blob流轉(zhuǎn)化為image, 直接插入到瀏覽器中;
html5支持讀取Blob(二進(jìn)制大對(duì)象, file文件也是繼承了Blob), 并轉(zhuǎn)化為圖片流或者文字流或者其他流格式, 這也是為什么瀏覽器可以讀取"application/zip"文件的原因;
要在瀏覽器中解壓zip文件的話需要引入四個(gè)js , 因?yàn)閁nZipArchive.js依賴了zip.js, mime-type.js和jquery.js , 測(cè)試demo如下:
<!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++ ) { //點(diǎn)擊li的話直接下載文件; str += "<li onclick=download('"+arr[i]+"')>"+arr[i]+"</li>" }; $("#dir").html( str ); }); }); var download = function ( filename ) { un.download( filename ); }; </script> </body> </html>
UnzioarichiveJS 是自己封裝的, 有任何問(wèn)題的話請(qǐng)及時(shí)反饋
解壓ZIP壓縮包的完整DEMO
<!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瀏覽器中運(yùn)行, 可以在safari6和IE10,以及IE10以上運(yùn)行; </p> <p> 如果要在IE9和safari中運(yùn)行需要兩個(gè)設(shè)置: </p> <code> 1:zip.useWebWorkers == false </code> <code> 2:并引用這個(gè)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 的實(shí)例; * */ var UnZipArchive = function( blob ) { if( !blob ) { alert("參數(shù)不正確, 需要一個(gè)Blob類型的參數(shù)"); return ; }; if( !(blob instanceof Blob) ) { alert("參數(shù)不是Blob類型"); return ; }; function noop() {}; this.entries = {}; this.zipReader = {}; var _this = this; this.length = 0; this.onend = noop; this.onerror = noop; this.onprogress = noop; //創(chuàng)建一個(gè)延遲對(duì)象; var def = this.defer = new $.Deferred(); zip.createReader( new zip.BlobReader( blob ), function(zipReader) { _this.zipReader = zipReader; zipReader.getEntries(function(entries) { _this.entries = entries; //繼續(xù)執(zhí)行隊(duì)列; def.resolve(); }); }, this.error.bind(_this) ); }; /** * @desc 把blob文件轉(zhuǎn)化為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 獲取對(duì)應(yīng)的blob數(shù)據(jù); * @param filename 文件名; * @param callback回調(diào), 參數(shù)為 blob; * @desc 或者可以直接傳一個(gè)函數(shù)作為zip解壓縮完畢的回調(diào); * */ "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>
但是瀏覽器兼容又是大問(wèn)題;
- 在vue.js中使用JSZip實(shí)現(xiàn)在前端解壓文件的方法
- 基于pako.js實(shí)現(xiàn)gzip的壓縮和解壓功能示例
- JavaScript 實(shí)現(xiàn)的 zip 壓縮和解壓縮工具包Zip.js使用詳解
- node.js使用zlib模塊進(jìn)行數(shù)據(jù)壓縮和解壓操作示例
- node.js實(shí)現(xiàn)簡(jiǎn)單的壓縮/解壓縮功能示例
- 詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架)
- 基于Node.js實(shí)現(xiàn)壓縮和解壓縮的方法
- GitHub上一些實(shí)用的JavaScript的文件壓縮解壓縮庫(kù)推薦
- JavaScript 如何在線解壓 ZIP 文件
相關(guān)文章
動(dòng)態(tài)的改變IFrame的高度實(shí)現(xiàn)IFrame自動(dòng)伸展適應(yīng)高度
動(dòng)態(tài)的改變IFrame的高度,實(shí)現(xiàn)IFrame自動(dòng)伸展,父頁(yè)面也自動(dòng)神縮原理: 在IFrame子頁(yè)面一加載的時(shí)候,調(diào)用父IFrame對(duì)象,改變其高度2012-12-12JavaScript canvas實(shí)現(xiàn)代碼雨效果
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)代碼雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06IE6下JS動(dòng)態(tài)設(shè)置圖片src地址問(wèn)題
解決IE6下JS動(dòng)態(tài)設(shè)置圖片IMG的SRC時(shí)圖片無(wú)法加載錯(cuò)誤的方法2010-01-01javascript設(shè)計(jì)模式之單體模式學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了javascript設(shè)計(jì)模式之單體模式學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02