Zip архивы в node.js - PullRequest
       16

Zip архивы в node.js

45 голосов
/ 22 апреля 2011

Я хочу создать zip-архив и распаковать его в node.js. Я не могу найти реализацию любого узла. Пожалуйста, помогите.

Ответы [ 10 ]

28 голосов
/ 24 октября 2013

ядро ​​узла имеет встроенные функции 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);
26 голосов
/ 27 июля 2011

Я закончил делать это так (я использую 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();
                }
            });
        });
9 голосов
/ 10 мая 2012

Вы можете попробовать node-zip npm module.

Он переносит JSZip на узел для сжатия / распаковки zip-файлов.

6 голосов
/ 06 апреля 2015

Вы можете использовать модуль архиватора , это было очень полезно для меня, вот пример:

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();
});
1 голос
/ 02 мая 2019

Мне показалось, что проще всего обернуть мою собственную оболочку вокруг 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');
})();
1 голос
/ 17 октября 2014

Я использовал «архиватор» для архивирования файлов. Вот одна из ссылок Stackoverflow, которая показывает, как ее использовать, Ссылка Stackoverflow для архивирования файлов с архиватором

1 голос
/ 23 сентября 2011

Если вам нужно только распаковать, node-zipfile выглядит менее тяжелым, чем node-archive .Это определенно имеет меньшую кривую обучения.

0 голосов
/ 20 апреля 2013

Вы можете использовать модуль edge.js , который поддерживает взаимодействие между node.js и внутрипроцессным .NET, а затем вызывать класс ZipFile платформы .NET, который позволяет вам манипулировать ZIP-архивами. Вот полный пример создания ZIP-пакета с использованием edge.js . Также посмотрите пример распаковки , используя edge.js .

0 голосов
/ 10 февраля 2013

адм-молния

Это библиотека только для JavaScript для чтения, создания и изменения zip-архивов в памяти.

Выглядит красиво, но немного глючит. У меня возникли проблемы с распаковкой текстового файла.

0 голосов
/ 23 апреля 2011

Если вы не хотите использовать / изучать библиотеку, вы можете использовать узел для управления инструментами командной строки zip, выполняя дочерние процессы

Хотя я бы порекомендовал изучить библиотеку, подобную той, что упоминала Эммерман

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...