Travailler avec les archives ZIP dans Node.js : bibliothèques adm-zip et archiver
Dans le développement web moderne avec Node.js, il est souvent nécessaire de travailler avec des archives : compresser des logs, transférer des fichiers par groupes, décompresser des données téléchargées par l'utilisateur. Dans cet article, nous examinerons deux bibliothèques principales pour travailler avec le format ZIP — adm-zip et archiver. Elles résolvent pratiquement toutes les tâches liées à l'archivage et conviennent parfaitement aussi bien pour des scripts simples que pour des applications de production.
Bibliothèque adm-zip : outil universel pour lire et écrire des ZIP
adm-zip est une implémentation purement JavaScript pour travailler avec des archives ZIP sans dépendances externes. Elle permet à la fois de créer de nouvelles archives et de lire/modifier des archives existantes. La bibliothèque est simple à utiliser et ne nécessite pas l'installation d'utilitaires système supplémentaires.
Installation
npm install adm-zipCréation d'une archive ZIP
const AdmZip = require('adm-zip');const fs = require('fs');
// Créer une nouvelle instance d'archiveconst zip = new AdmZip();
// Ajouter des fichiers à partir d'un buffer ou d'une chaînezip.addFile('hello.txt', Buffer.from('Hello, World!', 'utf8'));
// Ajouter un fichier localzip.addLocalFile('/path/to/image.png');
// Ajouter un dossier entierzip.addLocalFolder('/path/to/documents', 'docs');
// Écrire l'archive sur le disquezip.writeZip('./output/archive.zip');
console.log('Archive créée avec succès !');Lecture et décompression d'une archive existante
const AdmZip = require('adm-zip');
// Charger une archive existanteconst zip = new AdmZip('./input/archive.zip');
// Obtenir la liste des fichiersconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Fichier : ${entry.entryName}, taille : ${entry.header.size} octets`);});
// Extraire tous les fichiers dans un dossier spécifiézip.extractAllTo('./extracted', true); // true — écraser les fichiers existants
// Ou obtenir le contenu d'un fichier spécifiqueconst content = zip.readAsText('data.json');console.log('Contenu de data.json :', content);Travailler avec des buffers (sans écriture sur le disque)
const AdmZip = require('adm-zip');const zip = new AdmZip();
zip.addFile('report.csv', 'id,name,age1,John,30');
// Obtenir l'archive sous forme de Buffer pour l'envoyer via HTTPconst archiveBuffer = zip.toBuffer();
// Maintenant, archiveBuffer peut être envoyé comme réponse du serveur// ou passé à une autre fonctionBibliothèque archiver : archivage avancé par flux
archiver est une bibliothèque plus puissante, optimisée pour travailler avec de grands volumes de données. Elle utilise les flux (streams) de Node.js, ce qui permet d'archiver des fichiers « à la volée » sans charger tout le contenu en mémoire. C'est un choix idéal pour les applications serveur avec des ressources limitées.
Installation
npm install archiverCréation d'une archive avec sortie par flux
const archiver = require('archiver');const fs = require('fs');const path = require('path');
// Créer un flux d'écritureconst output = fs.createWriteStream('./backup.zip');const archive = archiver('zip', { zlib: { level: 9 } // Niveau de compression maximal});
// Gestion des événementsoutput.on('close', () => { console.log(`Archive créée : ${archive.pointer()} octets`);});
archive.on('error', (err) => { throw err;});
// Connecter le flux de l'archive au fichier de sortiearchive.pipe(output);
// Ajouter des fichiersarchive.file('/var/log/app.log', { name: 'logs/app.log' });
// Ajouter un répertoire récursivementarchive.directory('uploads/', 'user_files');
// Ajouter une chaîne comme fichierarchive.append('Ceci est le contenu du fichier', { name: 'readme.txt' });
// Finaliser l'archivagearchive.finalize();Envoi d'une archive via une réponse HTTP
const express = require('ex