Travailler avec les archives ZIP dans Node.js : les bibliothèques archiver et adm-zip
Dans le développement web moderne avec Node.js, il est souvent nécessaire de compresser des fichiers dans des archives ou d'en extraire des données. Qu'il s'agisse de sauvegardes, de téléchargement de plusieurs fichiers en une seule archive ou de traitement de données utilisateur, le travail avec le format ZIP reste très demandé. Pour Node.js, il existe plusieurs bibliothèques populaires, et dans cet article, nous examinerons les deux plus puissantes et pratiques : archiver (pour créer des archives) et adm-zip (pour lire et manipuler des archives).
Pourquoi des bibliothèques pour travailler avec ZIP ?
Node.js ne fournit pas par défaut d'outils intégrés pour travailler avec les archives. Bien qu'il existe le module zlib pour la compression de flux individuels, la création de fichiers ZIP complets avec plusieurs fichiers et dossiers nécessite des solutions spécialisées. Les bibliothèques archiver et adm-zip résolvent ces tâches en offrant une API simple et des performances élevées.
Installation des bibliothèques
Les deux bibliothèques s'installent via npm. Exécutez dans le terminal :
npm install archiver adm-zipBibliothèque archiver : création d'archives ZIP
archiver est une bibliothèque pour créer des archives de différents formats (ZIP, TAR, GZIP). Elle fonctionne avec des flux (streams), ce qui permet de traiter efficacement de gros volumes de données sans charger l'intégralité du fichier en mémoire.
Principales fonctionnalités d'archiver :
- Création d'archives ZIP avec niveau de compression configurable
- Ajout de fichiers et de dossiers entiers
- Travail avec des flux (streams) pour économiser la mémoire
- Prise en charge des commentaires et des métadonnées
Exemple : création d'une archive ZIP simple
const fs = require('fs');const archiver = require('archiver');
// Création d'un flux d'écriture vers un fichierconst output = fs.createWriteStream('example.zip');const archive = archiver('zip', { zlib: { level: 9 } }); // compression maximale
// Gestion des événementsoutput.on('close', () => { console.log(`Archive créée : ${archive.pointer()} octets`);});
archive.on('error', (err) => { throw err;});
// Ajout de fichiersarchive.append('Contenu du fichier 1', { name: 'file1.txt' });archive.file('/path/to/existing/file.txt', { name: 'renamed-file.txt' });archive.directory('my_folder/', 'new_folder_name');
// Finalisation de l'archivagearchive.pipe(output);archive.finalize();Exemple : archivage avec transmission par flux
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('Fichier texte', { name: 'text.txt' }); archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' }); archive.finalize();}).listen(3000);Bibliothèque adm-zip : lecture et extraction d'archives
adm-zip est une bibliothèque polyvalente pour travailler avec les archives ZIP : lecture, écriture, mise à jour et extraction. Contrairement à archiver, elle fonctionne non seulement avec des flux, mais aussi avec des tampons (buffers), ce qui est pratique pour les petites archives.
Principales fonctionnalités d'adm-zip :
- Lecture de fichiers ZIP existants
- Extraction de tous les fichiers ou de fichiers individuels
- Écriture de nouvelles archives (alternative à archiver)
- Travail avec des tampons et des chaînes
Exemple : extraction de fichiers d'une archive
const AdmZip = require('adm-zip');
// Chargement d'une archive existanteconst zip = new AdmZip('./example.zip');
// Obtention de la liste des fichiersconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Fichier