Библиотека 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-запросы) можно использовать буфер
Также в библиотеке
Генерация QR-кодов на Java: библиотека ZXing (подробное руководство)
Работа с датами в C# (.NET): обзор библиотек и встроенных средств
Кэширование в TypeScript: Redis, Memcached и in-memory решения
Геолокация и карты в Kotlin: библиотеки, инструменты и примеры