以下代码段使用zip.js创建zip存档,ZippyMcZip.zip或内容中的字符串。 contents是一个值数组。 e.g。
{name:"my name",contents:"contents to write to file."}
正在创建存档,但是除了清单之外它是空的:
$ unzip -l ZippyMcZip.zip
Archive: ZippyMcZip.zip
Length Date Time Name
-------- ---- ---- ----
0 05-01-13 16:41 File1.txt
0 05-01-13 16:41 File2.txt
-------- -------
0 2 files
有没有人有关于存档为什么包含空文件的指示?
saveAs 由FileSaver.js提供,我不认为这是一个问题,因为该文件正在写入HD并在其他地方使用。
function createZip(contents) {
function onProgress(a,b) {
console.log("current",a, "end",b);
}
function onEnd() {
console.log("on End");
}
zip.workerScriptsPath = "/js/zip/";
zip.useWebWorkers = false;
var zipper = (function() {
var zipWriter;
return {
addTexts: function(files) {
function add(text) {
zipWriter.add(text.name,
new zip.TextReader(text.contents),onEnd,onProgress);
}
zip.createWriter(new zip.BlobWriter(), function(writr) {
zipWriter = writr;
});
_.foreach(files, add);
},
getBlob: function(callback) {
zipWriter.close(callback);
}
};
})();
zipper.addTexts(contents);
zipper.getBlob(function(blob) {
saveAs(blob, "ZippyMcZip.zip");
});
}
答案 0 :(得分:0)
您有两个与zip.js API的异步性质相关的问题。
首先,您尝试并行编写多个文件:它不起作用。因此,您不必使用同步_.foreach
函数进行迭代,而是必须在add
方法的onEnd
回调中递归调用zipWriter.add
函数(参见[1]
} )。
然后,您还必须等待在调用zipWriter.close
方法之前编写此内容,因此您必须在签名中定义callback
参数(参见[2]
) addTexts
方法。在递归过程完成时调用它。
以下是包含以下2个修补程序的代码:
function createZip(contents) {
function onProgress(a, b) {
console.log("current", a, "end", b);
}
zip.workerScriptsPath = "/js/zip/";
zip.useWebWorkers = false;
var zipper = (function() {
var zipWriter;
return {
addTexts : function(files, callback /* [2] new parameter */) {
function add(fileIndex) {
if (fileIndex < files.length) {
zipWriter.add(files[fileIndex].name,
new zip.TextReader(files[fileIndex].contents), function() {
add(fileIndex + 1); /* [1] add the next file */
}, onProgress);
} else {
callback() /* [2] no more files to add: callback is called */;
}
}
zip.createWriter(new zip.BlobWriter(), function(writer) {
zipWriter = writer;
add(0); /* [1] add the first file */
});
},
getBlob : function(callback) {
zipWriter.close(callback);
}
};
})();
zipper.addTexts(contents, function() {
zipper.getBlob(function(blob) {
saveAs(blob, "ZippyMcZip.zip");
});
});
}