Je veux créer une archive Zip et décompressez-la dans node.js. Je ne trouve aucune implémentation de nœud. Veuillez aider.
node-core a intégré des fonctionnalités Zip: http://nodejs.org/api/zlib.html
Utilise les:
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);
J'ai fini par le faire comme ça (j'utilise Express). Je crée un Zip qui contient tous les fichiers d'un répertoire donné (SCRIPTS_PATH).
Je n'ai testé cela que sur Mac OS X Lion, mais je suppose que cela fonctionnera très bien sur Linux et Windows avec Cygwin installé.
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();
}
});
});
Vous pouvez essayer node-Zip npm module.
Il transfère JSZip au nœud, pour compresser/décompresser les fichiers Zip.
Vous pouvez utiliser le module archiveur , cela m'a été très utile, voici un exemple:
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();
});
Si vous avez seulement besoin de décompresser, node-zipfile semble être moins lourd que node-archive . Il a certainement une courbe d'apprentissage plus petite.
J'ai trouvé plus facile de rouler mon propre wrapper autour de 7-Zip, mais vous pouvez tout aussi facilement utiliser Zip ou tout autre outil Zip en ligne de commande disponible dans votre environnement d'exécution. Ce module particulier ne fait qu'une chose: compresser un répertoire.
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);
}
});
}
Utilisez-le comme ceci, en supposant que vous avez enregistré le code ci-dessus dans zipdir.js
. Le troisième paramètre log
est facultatif. Utilisez-le si vous avez un enregistreur personnalisé. Ou supprimez entièrement mes déclarations de journal désagréables.
const zipdir = require('./zipdir');
(async () => {
await zipdir('/path/to/my/directory', '/path/to/file.Zip');
})();
J'ai utilisé "archiveur" pour compresser des fichiers. Voici l'un des liens Stackoverflow qui montre comment l'utiliser, lien Stackoverflow pour zipper des fichiers avec archiveur
Si vous ne voulez pas utiliser/apprendre une bibliothèque, vous pouvez tiliser le nœud pour contrôler les outils de ligne de commande Zip en exécutant des processus enfants
Bien que je recommande d'apprendre une bibliothèque comme celle mentionnée par Emmerman
C'est une bibliothèque javascript uniquement pour lire, créer et modifier des archives Zip en mémoire.
Il a l'air sympa, mais c'est un petit buggy. J'ai eu du mal à décompresser un fichier texte.