Работа с ZIP-архивами в Node.js: библиотека archiver и adm-zip

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с ZIP-архивами в Node.js: библиотеки archiver и adm-zip

В современной веб-разработке на Node.js часто возникает необходимость упаковывать файлы в архивы или извлекать данные из них. Будь то резервное копирование, загрузка нескольких файлов одним архивом или обработка пользовательских данных — работа с ZIP-форматом остаётся востребованной. Для Node.js существует несколько популярных библиотек, и в этой статье мы рассмотрим две самые мощные и удобные: archiver (для создания архивов) и adm-zip (для чтения и манипуляции архивами).

Зачем нужны библиотеки для работы с ZIP?

Node.js по умолчанию не предоставляет встроенных средств для работы с архивами. Хотя существует модуль zlib для сжатия отдельных потоков, для создания полноценных ZIP-файлов с несколькими файлами и папками требуются специализированные решения. Библиотеки archiver и adm-zip решают эти задачи, предлагая простой API и высокую производительность.

Установка библиотек

Обе библиотеки устанавливаются через npm. Выполните в терминале:

npm install archiver adm-zip

Библиотека archiver: создание ZIP-архивов

archiver — это библиотека для создания архивов различных форматов (ZIP, TAR, GZIP). Она работает с потоками (streams), что позволяет эффективно обрабатывать большие объёмы данных без загрузки всего файла в память.

Основные возможности archiver:

  • Создание ZIP-архивов с настраиваемым уровнем сжатия
  • Добавление файлов и целых директорий
  • Работа с потоками (streams) для экономии памяти
  • Поддержка комментариев и метаданных

Пример: создание простого ZIP-архива

const fs = require('fs');
const archiver = require('archiver');

// Создаём поток записи в файл
const output = fs.createWriteStream('example.zip');
const archive = archiver('zip', { zlib: { level: 9 } }); // максимальное сжатие

// Обработка событий
output.on('close', () => {
    console.log(`Архив создан: ${archive.pointer()} байт`);
});

archive.on('error', (err) => {
    throw err;
});

// Добавляем файлы
archive.append('Содержимое файла 1', { name: 'file1.txt' });
archive.file('/path/to/existing/file.txt', { name: 'renamed-file.txt' });
archive.directory('my_folder/', 'new_folder_name');

// Завершаем архивацию
archive.pipe(output);
archive.finalize();

Пример: архивация с потоковой передачей

const http = require('http');
const archiver = require('archiver');

http.createServer((req, res) => {
    res.writeHead(200, {
        'Content-Type': 'application/zip',
        'Content-disposition': 'attachment; filename=download.zip'
    });

    const archive = archiver('zip', { zlib: { level: 5 } });
    archive.pipe(res);

    archive.append('Текстовый файл', { name: 'text.txt' });
    archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' });
    archive.finalize();
}).listen(3000);

Библиотека adm-zip: чтение и извлечение архивов

adm-zip — это универсальная библиотека для работы с ZIP-архивами: чтение, запись, обновление и извлечение. В отличие от archiver, она работает не только с потоками, но и с буферами, что удобно для небольших архивов.

Основные возможности adm-zip:

  • Чтение существующих ZIP-файлов
  • Извлечение всех или отдельных файлов
  • Запись новых архивов (альтернатива archiver)
  • Работа с буферами и строками

Пример: извлечение файлов из архива

const AdmZip = require('adm-zip');

// Загружаем существующий архив
const zip = new AdmZip('./example.zip');

// Получаем список файлов
const zipEntries = zip.getEntries();
zipEntries.forEach((entry) => {
    console.log(`Файл: ${entry.entryName}, размер: ${entry.getData().length} байт`);
});

// Извлекаем все файлы в папку
zip.extractAllTo('./output_folder', true);

// Извлекаем один конкретный файл
const content = zip.readAsText('file1.txt');
console.log('Содержимое file1.txt:', content);

Пример: создание архива с помощью adm-zip

const AdmZip = require('adm-zip');
const zip = new AdmZip();

// Добавляем файлы
zip.addFile('notes.txt', Buffer.from('Hello                    

Рекомендаций