UnZipArchive.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /**
  2. * @desc 解压缩文件的类;
  3. * @return UnZipArchive 的实例;
  4. * */
  5. var UnZipArchive = function( blob ) {
  6. if( !blob ) {
  7. alert("参数不正确, 需要一个Blob类型的参数");
  8. return ;
  9. };
  10. if( !(blob instanceof Blob) ) {
  11. alert("参数不是Blob类型");
  12. return ;
  13. };
  14. function noop() {};
  15. this.entries = {};
  16. this.zipReader = {};
  17. var _this = this;
  18. this.length = 0;
  19. this.onend = noop;
  20. this.onerror = noop;
  21. this.onprogress = noop;
  22. //创建一个延迟对象;
  23. var def = this.defer = new $.Deferred();
  24. zip.createReader( new zip.BlobReader( blob ), function(zipReader) {
  25. _this.zipReader = zipReader;
  26. zipReader.getEntries(function(entries) {
  27. _this.entries = entries;
  28. //继续执行队列;
  29. def.resolve();
  30. });
  31. }, this.error.bind(_this) );
  32. };
  33. /**
  34. * @desc 把blob文件转化为dataUrl;
  35. * */
  36. UnZipArchive.readBlobAsDataURL = function (blob, callback) {
  37. var f = new FileReader();
  38. f.onload = function(e) {callback( e.target.result );};
  39. f.readAsDataURL(blob);
  40. };
  41. $.extend( UnZipArchive.prototype, {
  42. /**
  43. * @desc 获取压缩文件的所有入口;
  44. * @return ArrayList;
  45. * */
  46. "getEntries" : function() {
  47. var result = [];
  48. for(var i= 0, len = this.entries.length ; i<len; i++ ) {
  49. result.push( this.entries[i].filename );
  50. }
  51. return result;
  52. },
  53. /**
  54. * @desc 获取文件Entry;
  55. * @return Entry
  56. * */
  57. "getEntry" : function ( filename ) {
  58. var entrie;
  59. for(var i= 0, len = this.entries.length ; i<len; i++ ) {
  60. if( this.entries[i].filename === filename) {
  61. return this.entries[i];
  62. };
  63. }
  64. },
  65. /**
  66. * @desc 下载文件
  67. * @param filename;
  68. * @return void;
  69. * */
  70. "download" : function ( filename , cb , runoninit) {
  71. var _this = this;
  72. this.defer = this.defer.then(function() {
  73. var def = $.Deferred();
  74. if(!filename) return ;
  75. if(runoninit) {
  76. return runoninit();
  77. };
  78. var entry = _this.getEntry( filename );
  79. if(!entry)return;
  80. entry.getData(new zip.BlobWriter(zip.getMimeType(entry.filename)), function(data) {
  81. if( !cb ) {
  82. UnZipArchive.readBlobAsDataURL(data, function( dataUrl ) {
  83. var downloadButton = document.createElement("a"),
  84. URL = window.webkitURL || window.mozURL || window.URL;
  85. downloadButton.href = dataUrl;
  86. downloadButton.download = filename;
  87. downloadButton.click();
  88. def.resolve( dataUrl );
  89. _this.onend();
  90. });
  91. }else{
  92. cb( data );
  93. def.resolve( data );
  94. }
  95. });
  96. return def;
  97. });
  98. },
  99. /**
  100. * @desc 获取对应的blob数据;
  101. * @param filename 文件名;
  102. * @param callback回调, 参数为 blob;
  103. * @desc 或者可以直接传一个函数作为zip解压缩完毕的回调;
  104. * */
  105. "getData" : function ( filename, fn ) {
  106. if( typeof filename === "string") {
  107. this.download(filename, function( blob ) {
  108. fn&&fn( blob );
  109. });
  110. }else if( typeof filename === "function") {
  111. this.download("test", null, function( blob ) {
  112. filename();
  113. });
  114. };
  115. },
  116. "error" : function() {
  117. this.onerror( this );
  118. throw new Error("压缩文件解压失败");
  119. }
  120. });