Node.js 要提取的 jszip 库
Node.js jszip library to extract
我正在编写一些节点代码,并使用 jszip 压缩和解压缩一些文件。我知道如何压缩,但不知道如何解压缩或解压缩。 Whosebug 上有几个链接不起作用。任何人有任何解决方案吗?
以下是我尝试过的
var fs = require('fs');
var JSZip = require('jszip');
var zipName = "C:/test.zip";
var unzip = "C:/unzip";
fs.readFile(zipName, function (err, data) {
if (err) throw err;
var zip = new JSZip();
zip.folder(unzip).load(data);
});
JSZip 没有在磁盘上写入文件的方法。为此,您需要遍历 zip.files
:
var path = require("path");
Object.keys(zip.files).forEach(function(filename) {
var content = zip.files[filename].asNodeBuffer();
var dest = path.join(unzip, filename);
fs.writeFileSync(dest, content);
}
在 zip 文件中,文件夹用正斜杠 '/' 表示,我 认为 path.join()
会创建正确的路径,但我无法测试这个。
可能是我对asNodeBuffer
的错误实现和我对JS的经验不足,但我一直错误地提取文件。
我想分享最终对我有用的东西,我用一个 250+ MB 的文件对其进行了测试。
...
fs.readFile(tmpFilePath, function (err, data) {
if (err) {
throw err;
}
logger.debug('[method] Before extracting file...');
JSZip.loadAsync(data).then(function (zip) {
var files = Object.keys(zip.files);
logger.debug('[method] files to be created ' + files.length);
// in my case, the folders where not being created while "inflating" the content. created the folders in a separated loop
// O(n) for those geeks on complexity.
createDirectories(files);
createFiles(files, zip, someOtherFunctionReference);
}).catch(function (err) {
deferred.reject(err);
});
});
...
/**
* Sync opperation to create the folders required for the files.
* @param files
*/
function createDirectories(files) {
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
ensureDirectoryExistence(dest);
});
}
/**
* recursive create directory function
* @param filePath
* @returns {boolean}
*/
function ensureDirectoryExistence(filePath) {
var dirname = path.dirname(filePath);
if (fs.existsSync(dirname)) {
return true;
}
ensureDirectoryExistence(dirname);
fs.mkdirSync(dirname);
}
/**
* Create files sync or blocking
* @param files
* @param zip
* @param cb
*/
function createFiles(files, zip, cb) {
try {
var countFilesCreated = 0;
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
// skip directories listed
if (dest.charAt(dest.length - 1) === '/') {
countFilesCreated++;
return;
}
return zip.file(filename).async('nodebuffer').then(function(content){
// var content = zip.files[filename].nodeStream();
fs.writeFileSync(dest, content);
countFilesCreated++;
// proably someone with more experience in JS can implement a promice like solution.
// I thought that in here instead of the counter we coud use an indexOf to return an error in case not all the elements where created correctly.
// but if a file throw an error, its handled by the catch ...
if (countFilesCreated >= files.length) {
logger.debug('All files created!!');
cb();
}
});
});
} catch (err) {
throw err;
}
}
希望对您有所帮助。
我正在编写一些节点代码,并使用 jszip 压缩和解压缩一些文件。我知道如何压缩,但不知道如何解压缩或解压缩。 Whosebug 上有几个链接不起作用。任何人有任何解决方案吗? 以下是我尝试过的
var fs = require('fs');
var JSZip = require('jszip');
var zipName = "C:/test.zip";
var unzip = "C:/unzip";
fs.readFile(zipName, function (err, data) {
if (err) throw err;
var zip = new JSZip();
zip.folder(unzip).load(data);
});
JSZip 没有在磁盘上写入文件的方法。为此,您需要遍历 zip.files
:
var path = require("path");
Object.keys(zip.files).forEach(function(filename) {
var content = zip.files[filename].asNodeBuffer();
var dest = path.join(unzip, filename);
fs.writeFileSync(dest, content);
}
在 zip 文件中,文件夹用正斜杠 '/' 表示,我 认为 path.join()
会创建正确的路径,但我无法测试这个。
可能是我对asNodeBuffer
的错误实现和我对JS的经验不足,但我一直错误地提取文件。
我想分享最终对我有用的东西,我用一个 250+ MB 的文件对其进行了测试。
...
fs.readFile(tmpFilePath, function (err, data) {
if (err) {
throw err;
}
logger.debug('[method] Before extracting file...');
JSZip.loadAsync(data).then(function (zip) {
var files = Object.keys(zip.files);
logger.debug('[method] files to be created ' + files.length);
// in my case, the folders where not being created while "inflating" the content. created the folders in a separated loop
// O(n) for those geeks on complexity.
createDirectories(files);
createFiles(files, zip, someOtherFunctionReference);
}).catch(function (err) {
deferred.reject(err);
});
});
...
/**
* Sync opperation to create the folders required for the files.
* @param files
*/
function createDirectories(files) {
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
ensureDirectoryExistence(dest);
});
}
/**
* recursive create directory function
* @param filePath
* @returns {boolean}
*/
function ensureDirectoryExistence(filePath) {
var dirname = path.dirname(filePath);
if (fs.existsSync(dirname)) {
return true;
}
ensureDirectoryExistence(dirname);
fs.mkdirSync(dirname);
}
/**
* Create files sync or blocking
* @param files
* @param zip
* @param cb
*/
function createFiles(files, zip, cb) {
try {
var countFilesCreated = 0;
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
// skip directories listed
if (dest.charAt(dest.length - 1) === '/') {
countFilesCreated++;
return;
}
return zip.file(filename).async('nodebuffer').then(function(content){
// var content = zip.files[filename].nodeStream();
fs.writeFileSync(dest, content);
countFilesCreated++;
// proably someone with more experience in JS can implement a promice like solution.
// I thought that in here instead of the counter we coud use an indexOf to return an error in case not all the elements where created correctly.
// but if a file throw an error, its handled by the catch ...
if (countFilesCreated >= files.length) {
logger.debug('All files created!!');
cb();
}
});
});
} catch (err) {
throw err;
}
}
希望对您有所帮助。