Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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/...

Ответ 8

adm-zip

Это библиотека только для 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.