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和DOM Interfaces来处理HTML
Oct 09 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
JavaScript中字符串拼接的基本方法
Jul 07 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
Sep 04 Javascript
JS操作JSON方法总结(推荐)
Jun 14 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
vue.js项目中实用的小技巧汇总
Nov 29 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
JavaScript之解构赋值的理解
Jan 30 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一些常用的正则表达式字符的一些转换
2008/07/29 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
SVG描边动画
2017/02/23 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
辞职信怎么写?
2019/05/21 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
HTML中的表单元素介绍
2022/02/28 HTML / CSS
Python学习之迭代器详解
2022/04/01 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB