Работа с 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