通过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如下:

<!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 是自己封装的, 有任何问题的话反馈至github的issue

https://github.com/sqqihao/nono_framework/issues?q=is%3Aopen+is%3Aissue

  解压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>

  但是浏览器兼容又是大问题;

作者: NONO
出处:http://www.cnblogs.com/diligenceday/

QQ:287101329

时间: 2024-10-06 16:23:09

通过javascript在网页端解压zip文件并查看压缩包内容的相关文章

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 http://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipAr

android zip4j之--解压zip文件并实时显示解压进度

Zip文件是我们经常用到压缩文件格式,android中在进行网络请求大批量数据时,通常会采用传递zip文件,这样做即可以减少网络流量的消耗,加快请求的响应速度,又可以减少对存储空间的要求,所以当我们将zip文件读取回来的时候,如何解压就是一个要解决的问题,虽然java本身提供了zip相关的API,但不是很强大,所以我们采用apache开源组织的zip4j,通过这个jar包可以十分轻松的解压zip文件. 回到项目中去,项目中有个需求是从服务器请求杂志,请求回来后给读者展示,但是由于公司自己做的电子

ubuntu解压zip文件中文乱码问题

通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip 注:xxx.zip为需要解压的文件名 ubuntu解压zip文件中文乱码问题

基于Android下载并解压Zip文件,更新UI简单帮助类

类似于:http://blog.csdn.net/jarlen/article/details/44794031 下载文件: /** * 下载文件 * * @param down_url * @param output * @param tmpDir */ private void download(String down_url, File output, File tmpDir) { InputStream inputStream = null; OutputStream outputStr

Ubuntu中解决解压zip文件中文乱码问题

1. 通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明, unzip --help对这个参数有一行简单的说明. 2. 在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件 /etc/environment中加入2行 UNZIP="-O CP936" ZIPINFO="-O CP936"Ubuntu中解决解压zip文件中文乱码问题

php解压zip文件

php实现解压zip文件 1 function zip($filename, $path) 2 { 3 // $filename = 'test.zip'; 4 // $path = './document/2016-05-11/test.zip'; 5 $path_all = $_SERVER['DOCUMENT_ROOT'] . sp_get_asset_upload_path(mb_substr($path, 2));//think_cmf的获取文件路劲 6 $file_name_head

Java 上传解压zip文件,并且解析文件里面的excel和图片

需求:上传一个zip文件,zip文件里面包含一个excel和很多图片,需要把excel里面的信息解析出来保存到表中,同时图片也转化成base64保存到数据库表中. PS:为了方便不同水平的开发人员阅读,我把代码全部写到Controller里面.这个demo的file入参的类型是MultipartFile,很多网上的例子是File类型.这两个类型在解析文件的时候还是有点区别的. 第①个方法: 1 /** 2 * 这个deomo入参的类型是MultipartFile,很多网上的例子是File类型 3

JAVA解压ZIP文件

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import

redhat下安装mysql 5.6.20,解压zip包,查看已经安装过的mysql,卸载rpm安装包,安装mysql服务器端和客户端,修改mysql用户名,登陆mysql,启动关闭mysql

 1 将相关的mysql rpm包上传到redhat上 2  我的电脑是Redhat 6.*版本,所以这里使用上面一个 3  解压zip包 4  安装以下几个rpm MySQL-client-advanced-5.6.20-1.el6.x86_64.rpm MySQL-server-advanced-5.6.20-1.el6.x86_64.rpm 5  查看已经安装过的mysql rpm –aq | grep mysql 结果: mysql-libs-5.1.66-2.el6_3.x86_6