web-dev-qa-db-fra.com

Archives Zip dans node.js

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.

45
msikora

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);
28
MateodelNorte

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();
                }
            });
        });
26
Eliseo Soto

Vous pouvez essayer node-Zip npm module.

Il transfère JSZip au nœud, pour compresser/décompresser les fichiers Zip.

9
daraosn

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();
});
6
Ragnar

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.

1
Paul Beusterien

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');
})();
1
Todd Price

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

1
WaughWaugh

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

0
timoxley

adm-Zip

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.

0
Elmer