JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解


Posted in Javascript onDecember 14, 2015

zip.js是什么

zip.js的github项目地址:http://gildas-lormeau.github.io/zip.js/

通过zip.js封装一个能在网页端生成zip文件的插件, 直接在网页中创建包含文件夹和文件的压缩包,也可以自定义名字并下载;

如何使用:

1:引用zip.js

2:引用jQuery;

3:并引用封装的ZipArchive.js ,(因为zip.js的api使用起来比较繁琐,所以自己封装实现了这个插件)

4:引用mime-types.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/ZipArchive.js"></script>
</head>
<body>

<script>
  var z = new ZipArchive;
  z.addFile("a/a.txt", "aaaaaaacontent");
  z.addFile("aaaa.txt", "aaaaaaaccccc");
  z.export("nono");
</script>
</body>
</html>

DEMO在后面:文件下载下来, 文件夹的格式如下:

JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解

回到顶部

创建压缩文件和文件夹的详细源代码:
运行下面代码

<!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>
  </div>
<script>
  zip.workerScriptsPath = "http://gildas-lormeau.github.io/zip.js/demos/";
  /**
   * @desc 压缩文件;
   * @event onprogress, onend, onerror;
   * */
  var ZipArchive = function() {
    function noop() {};
    this.name = "未命名文件";
    this.zippedBlob = {};
    var _this = this;
    this.length = 0;
    this.onend = noop;
    this.onerror = noop;
    this.onprogress = noop;
    //创建一个延迟对象;
    var def = this.defer = new $.Deferred();
    zip.createWriter( new zip.BlobWriter("application/zip"), function(zipWriter) {
      _this.zipWriter = zipWriter;
      //继续执行队列;
      def.resolve();
    }, this.error );
  };

  ZipArchive.blob = function (filename, content) {
    return new Blob([ content ], {
      type : zip.getMimeType(filename)
    });
  };

  $.extend( ZipArchive.prototype, {
    /**
     * @desc 添加文件
     * @param String filename为文件的名字;
     * @param String content;
     * @param Object options 传参
     *   例如:{ level : 0} 压缩的等级,0 到 9;
     *   例如:{ comment : "提示文字" }
     *   例如:{ lastModDate : "最后编辑时间" }
     * */
    "addFile" : function ( filename , content, options) {
      var _this = this;
      blob = ZipArchive.blob(filename, content);
      //为了产生链式的效果, 必须把deferrer赋值给新的defer
      this.defer = this.defer.then(function() {
        var def = $.Deferred();

        _this.zipWriter.add(filename, new zip.BlobReader(blob)
            ,function() { // reader
              console.log("addFile success!!");
              def.resolve();
              //zipWriter.close(callback);
            }, function (size, total) { //onend
              _this.onend(filename, blob, total);
              _this.length += total;
            }, function () { //onprogress
              _this.onprogress(filename, blob, total);
            },options || {
              //options
            });

        return def;
      });
    },

    /**
     * @desc 添加文件夹, 我发现这个文件无法创建;
     * @desc 创建文件夹功能不好用, 需要创建文件夹你通过 zipWriter.addFile("directory/filename.txt", blob())创建文件夹和对应文件;;
     * */
    "_addFolder" : function (foldername , options) {
      //创建文件夹功能目前不能用;
      //创建文件夹功能不好用, 直接通过 zipWriter.addFile("directory/filename.txt", blob())创建文件夹和文件
      return this;
    },

    "size" : function () {
      return this.length;
    },

    /**
     * @desc 获取blob文件
     * */
    "get" : function () {
      return this.zippedBlob;
    },

    /**
     * @desc 导出为zip文件
     * */
    "export" : function ( name ) {
      name = name || this.name;
      var _this = this;
      this.defer.then(function() {
        _this.zipWriter.close(function( zippedBlob ) {
          if( typeof name === "string" || typeof name === "number") {
            var downloadButton = document.createElement("a"),
                URL = window.webkitURL || window.mozURL || window.URL;
            downloadButton.href = URL.createObjectURL( zippedBlob );
            downloadButton.download = name + ".zip";
            downloadButton.click();
          }else{
            name( zippedBlob );
          };
        });
      });
    },

    "error" : function() {
      this.onerror( this );
      throw new Error("压缩文件创建失败");
    }
  });

</script>
<script>
  var z = new ZipArchive;
  z.addFile("a/a.txt", "aaaaaaacontent");
  z.addFile("aaaa.txt", "aaaaaaaccccc");
  z.export("nono");
</script>
</body>
</html>
Javascript 相关文章推荐
深入理解JavaScript系列(16) 闭包(Closures)
Apr 12 Javascript
JS网页图片按比例自适应缩放实现方法
Jan 15 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
Jun 10 Javascript
JS实现很实用的对联广告代码(可自适应高度)
Sep 18 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 Javascript
element vue Array数组和Map对象的添加与删除操作
Nov 14 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
JS实现点星星消除小游戏
Mar 24 Javascript
javascript操作向表格中动态加载数据
Aug 27 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 #Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 #Javascript
javascript中new关键字详解
Dec 14 #Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
Dec 14 #Javascript
Position属性之relative用法
Dec 14 #Javascript
CSS中position属性之fixed实现div居中
Dec 14 #Javascript
通过设置CSS中的position属性来固定层的位置
Dec 14 #Javascript
You might like
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
tensorboard显示空白的解决
2020/02/15 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
罗马假日观后感
2015/06/08 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
python中os.path.join()函数实例用法
2021/05/26 Python
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers