前端利用zip.js实现ZIP压缩包在线解压与查看
本文介绍如何在Web前端利用zip.js库实现ZIP压缩包的在线解压与查看。通过将JS、CSS及图片打包为ZIP传输,可节省服务器带宽并提升加载效率。文章详细说明了所需依赖库(zip.js、mime-type.js、jquery.js及封装库UnZipArchive.js),展示了HTML5 Blob对象在读取二进制数据中的作用,并提供了完整的代码示例与浏览器兼容性注意事项。
前端解压ZIP压缩包概述
实现Web前端对ZIP压缩包的解压功能。
Web前端解压ZIP文件的应用价值
探讨Web前端解压ZIP文件的应用价值。
在标准浏览器环境下,服务器仅需向客户端传输压缩包,这种方式能够有效节约网络带宽,并缩短数据传输时间,具有明显的性能优势。
ZIP打包与浏览器端处理机制
当项目包含大量前端代码及图片资源时,可将JS、CSS、JPG、PNG等文件在服务端打包为ZIP格式传输至浏览器。浏览器端负责解压操作:CSS通过动态生成方式插入DOM,JS通过globalEval直接执行,图片文件则通过Blob流转换为Image对象后直接插入浏览器页面。
HTML5 Blob对象在解压中的作用
HTML5规范支持读取Blob(二进制大对象,File文件继承自Blob),并可将其转化为图片流、文本流或其他数据流格式。这正是浏览器能够识别并处理"application/zip"类型文件的技术基础。
实现解压所需的JavaScript依赖库
若要在浏览器中实现ZIP文件解压,需引入四个JavaScript库。其中UnZipArchive.js依赖于zip.js、mime-type.js以及jquery.js。具体的测试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++ ) {
//点击li的话直接下载文件;
str += "<li onclick=download('"+arr[i]+"')>"+arr[i]+"</li>"
};
$("#dir").html( str );
});
});
var download = function ( filename ) {
un.download( filename );
};
</script>
</body>
</html>
UnZipArchiveJS封装库说明
UnZipArchiveJS为自行封装的库,如有使用问题请及时反馈。
解压ZIP压缩包的完整Demo示例
以下是解压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浏览器中运行, 可以在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>
浏览器兼容性注意事项
然而,浏览器的兼容性仍是需要重点考虑的问题。
JS 怎么使用 pako.js 解压 gzip 数据流
2026-11-05 15:54:33
零基础先学JavaScript还是Python?对比学习难度与上手曲线
2026-11-05 14:47:40
JS代码反混淆:主流在线工具与本地软件推荐
2026-11-04 19:28:41
浏览器控制台查看格式化JSON有哪些实用技巧
2026-11-04 16:56:53
JS控制台打印基础:console.log语法与多参数用法
2026-11-04 09:23:11
