Работа с ZIP/архивами в Node.js: библиотека Adm-Zip

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

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

Начать курс

Библиотека Adm-Zip для работы с ZIP-архивами в Node.js

При разработке веб-приложений, серверных утилит или инструментов для обработки данных на Node.js часто возникает необходимость работать с ZIP-архивами: упаковывать файлы перед отправкой пользователю, распаковывать полученные архивы или манипулировать содержимым без полной распаковки. В экосистеме JavaScript для этих задач существует несколько библиотек, и одна из самых популярных и простых в использовании — Adm-Zip.

Что такое Adm-Zip?

Adm-Zip — это чистая JavaScript-библиотека для Node.js, которая позволяет создавать, читать и изменять ZIP-архивы без внешних зависимостей (например, без установки утилиты zip или unzip в системе). Она работает как с файлами на диске, так и с буферами в памяти, что делает её идеальной для веб-серверов и облачных функций.

Основные возможности библиотеки:

  • Создание новых ZIP-архивов из файлов, папок или строковых данных.
  • Распаковка архивов с извлечением в указанную директорию или в буфер.
  • Чтение содержимого архива без полной распаковки (просмотр списка файлов, чтение отдельных записей).
  • Добавление, удаление и обновление файлов внутри уже существующего архива.
  • Работа с комментариями к архиву и отдельным файлам.
  • Поддержка паролей (шифрование ZipCrypto).
  • Работа с потоками (Stream) для обработки больших данных.

Установка

Установка библиотеки стандартна для npm-пакетов:

npm install adm-zip

После установки вы можете подключить её в своём проекте:

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

Создание ZIP-архива

Создать новый архив очень просто. Вы можете добавлять как отдельные файлы, так и целые папки.

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

// Создаём новый экземпляр архива
const zip = new AdmZip();

// Добавляем файл из строки
zip.addFile('hello.txt', Buffer.from('Hello, World!', 'utf8'));

// Добавляем файл с диска
zip.addLocalFile('/path/to/image.jpg');

// Добавляем содержимое локальной папки
zip.addLocalFolder('/path/to/documents', 'backup/docs');

// Записываем архив на диск
zip.writeZip('myarchive.zip');

console.log('Архив создан: myarchive.zip');

Вы также можете получить архив в виде буфера для отправки через HTTP-ответ:

const zipBuffer = zip.toBuffer();
// Теперь zipBuffer можно отправить пользователю как бинарный файл

Распаковка ZIP-архива

Распаковка выполняется в несколько строк. Библиотека поддерживает как извлечение всех файлов, так и чтение отдельных записей.

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

try {
    // Открываем существующий архив
    const zip = new AdmZip('myarchive.zip');

    // Извлекаем все файлы в указанную папку
    zip.extractAllTo('extracted/', true); // true — перезаписывать существующие файлы

    console.log('Архив распакован в папку extracted/');
} catch (err) {
    console.error('Ошибка при распаковке:', err.message);
}

Если вам нужно прочитать содержимое архива без распаковки:

const zip = new AdmZip('myarchive.zip');

// Получаем массив записей (файлов и папок)
const zipEntries = zip.getEntries();

zipEntries.forEach(entry => {
    if (!entry.isDirectory) {
        console.log(`Файл: ${entry.entryName}, размер: ${entry.header.size} байт`);
        // Читаем содержимое файла как строку
        const content = entry.getData().toString('utf8');
        console.log('Содержимое:', content.substring(0, 100));
    }
});

Работа с паролями (шифрование)

Adm-Zip поддерживает шифрование ZipCrypto. Обратите внимание: это не самый современный метод (AES не поддерживается), но для базовой защиты он подходит.

// Создание архива с паролем
const zip = new AdmZip();
zip.addFile('secret.txt', Buffer.from('Конфиденциальные данные'));
zip.writeZip('protected.zip', 'password123');

// Распаковка архива с паролем
const zipProtected = new AdmZip('protected.zip');
zipProtected.extractAllTo('output/', true, 'password123');

Работа с потоками (Stream API)

Для работы с большими файлами или при интеграции с другими потоками (например, HTTP-запросы) можно использовать буфер

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