Я хочу создать zip-архив и разархивировать его в node.js. Я не могу найти реализацию node. Пожалуйста, помогите.
Zip-архивы в node.js
Ответ 1
node -core имеет встроенные функции zip: http://nodejs.org/api/zlib.html
Используйте их:
var zlib = require('zlib');
var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');
inp.pipe(gzip).pipe(out);
Ответ 2
Я закончил это так (я использую Express). Я создаю ZIP, который содержит все файлы в данном каталоге (SCRIPTS_PATH).
Я тестировал это только на Mac OS X Lion, но я думаю, что он будет отлично работать в Linux и Windows с установленным Cygwin.
var spawn = require('child_process').spawn;
app.get('/scripts/archive', function(req, res) {
// Options -r recursive -j ignore directory info - redirect to stdout
var zip = spawn('zip', ['-rj', '-', SCRIPTS_PATH]);
res.contentType('zip');
// Keep writing stdout to res
zip.stdout.on('data', function (data) {
res.write(data);
});
zip.stderr.on('data', function (data) {
// Uncomment to see the files being added
//console.log('zip stderr: ' + data);
});
// End the response on zip exit
zip.on('exit', function (code) {
if(code !== 0) {
res.statusCode = 500;
console.log('zip process exited with code ' + code);
res.end();
} else {
res.end();
}
});
});
Ответ 3
Вы можете попробовать node-zip модуль npm.
Он переносит JSZip на node, чтобы сжать/распаковать zip файлы.
Ответ 4
Вы можете использовать модуль архиватора, это было очень полезно для меня, вот пример:
var Archiver = require('archiver'),
fs = require('fs');
app.get('download-zip-file', function(req, res){
var archive = Archiver('zip');
archive.on('error', function(err) {
res.status(500).send({error: err.message});
});
//on stream closed we can end the request
res.on('close', function() {
console.log('Archive wrote %d bytes', archive.pointer());
return res.status(200).send('OK').end();
});
//set the archive name
res.attachment('file-txt.zip');
//this is the streaming magic
archive.pipe(res);
archive.append(fs.createReadStream('mydir/file.txt'), {name:'file.txt'});
//you can add a directory using directory function
//archive.directory(dirPath, false);
archive.finalize();
});
Ответ 5
Если вам нужна только распаковка, node-zipfile выглядит менее тяжелым, чем node-archive. Он определенно имеет меньшую кривую обучения.
Ответ 6
Я использовал архиватор для архивирования файлов. Вот одна из ссылок Stackoverflow, которая показывает, как ее использовать, fooobar.com/questions/123818/...
Ответ 7
Если вы не хотите использовать/изучать библиотеку, вы можете использовать node для управления инструментами командной строки zip путем выполнения дочерних процессов
Хотя я бы рекомендовал изучить библиотеку, подобную той, что упоминается Emmerman
Ответ 8
Это библиотека только для javascript для чтения, создания и изменения zip-архивов в памяти.
Он выглядит неплохо, но он немного глючит. У меня были проблемы с распаковкой текстового файла.
Ответ 9
Я обнаружил, что проще всего обернуть мою собственную оболочку вокруг 7-zip, но вы можете также легко использовать zip или любой другой инструмент командной строки zip, доступный в вашей среде выполнения. Этот конкретный модуль просто делает одну вещь: заархивировать каталог.
const { spawn } = require('child_process');
const path = require('path');
module.exports = (directory, zipfile, log) => {
return new Promise((resolve, reject) => {
if (!log) log = console;
try {
const zipArgs = ['a', zipfile, path.join(directory, '*')];
log.info('zip args', zipArgs);
const zipProcess = spawn('7z', zipArgs);
zipProcess.stdout.on('data', message => {
// received a message sent from the 7z process
log.info(message.toString());
});
// end the input stream and allow the process to exit
zipProcess.on('error', (err) => {
log.error('err contains: ' + err);
throw err;
});
zipProcess.on('close', (code) => {
log.info('The 7z exit code was: ' + code);
if (code != 0) throw '7zip exited with an error'; // throw and let the handler below log it
else {
log.info('7zip complete');
return resolve();
}
});
}
catch(err) {
return reject(err);
}
});
}
Используйте это так, если вы сохранили приведенный выше код в zipdir.js
. Третий параметр log
является необязательным. Используйте его, если у вас есть собственный регистратор. Или полностью удалите мои противные записи в журнале.
const zipdir = require('./zipdir');
(async () => {
await zipdir('/path/to/my/directory', '/path/to/file.zip');
})();
Ответ 10
Вы можете использовать модуль edge.js, который поддерживает взаимодействие между node.js и .NET in-process, а затем вызывает .NET framework ZipFile класс, который позволяет вам манипулировать ZIP-архивами. Вот полный пример создания ZIP-пакета с использованием edge.js. Также проверьте разархивировать пример, используя edge.js.