Maak gebruik van Archiver- en Unzipper-pakketten om bestanden in Node.js te comprimeren en decomprimeren.

Bestandsarchivering is een dagelijkse bezigheid in de moderne wereld, aangezien iedereen kan getuigen van de voordelen die worden geboden door het comprimeren van bestanden of mappen in kleinere, draagbare formaten.

Het ZIP-formaat is een van de meest populaire archiefformaten die in de computerwereld worden gebruikt en wordt ten zeerste aanbevolen keuze voor iedereen die onbewerkte bestanden naar archieven moet converteren voor betere opslag, efficiënte overdracht of iets anders reden.

Dus waarom zou u overwegen uw bestanden te comprimeren, en hoe kunt u bestanden comprimeren naar ZIP en ze programmatisch terughalen naar hun oorspronkelijke staat met behulp van Node.js?

Waarom bestanden comprimeren?

Vaak worden bestanden en mappen erg groot, en het delen of overdragen ervan wordt een probleem omdat ze dat zijn ofwel te groot om op te slaan op een opslagstation met een specifieke capaciteit, of het duurt te lang om ze naar de cloud te uploaden opslag.

instagram viewer

In scenario's zoals deze en nog veel meer, zou u dergelijke bestanden of mappen moeten comprimeren tot een veel kleiner formaat. Afgezien van eenvoudigere bestandsoverdracht, zijn er nog andere redenen waarom u zou kunnen overwegen uw bestanden te comprimeren:

  • Efficiënte opslag
  • Betere bestandsstructuur en organisatie
  • Beveiliging (bestandsencryptie en wachtwoordbeveiliging)
  • Bestandsintegriteit
  • Versiebeheer van bestanden

Wat zijn de Node.js Archiver- en Unzipper-pakketten?

De archiver de officiële documentatie van het pakket beschrijft het pakket als "een streaming-interface voor het genereren van archieven". Dit houdt in dat het Archiver-pakket een bibliotheek met functies biedt die gebruikmaken van Node.js-streams om gecomprimeerde bestandsarchieven te maken.

Het Archiver-pakket ondersteunt standaard meerdere archiefindelingen, waaronder ZIP, GZIP en TAR. Met het pakket kunt u ook archieven maken van bestanden en mappen, en grote archieven opsplitsen in kleinere delen (archieven met meerdere volumes). Hiermee kunt u ook bestanden uitsluiten of filteren tijdens het comprimeren.

De Rits openen pakket is een zeer efficiënt pakket voor het extraheren van ZIP-archieven in Node.js. Het pakket biedt een gebruiksvriendelijke API waarmee ontwikkelaars ZIP-bestanden kunnen extraheren met slechts een paar regels code.

De pakketten Archiver en Unzipper zijn de keuzes voor deze zelfstudie omdat ze naadloos integreren met Node.js fs module, zorgen voor soepele compatibiliteit en eenvoud.

Bestanden comprimeren naar ZIP-indeling in Node.js

Bestanden comprimeren naar ZIP-formaat in Node.js is eenvoudig, net als in elke andere taal, dankzij het Archiver-pakket. Om ZIP-archieven in Node.js te maken terwijl u deze sectie volgt, moet u een Node.js-ontwikkelomgeving op uw computer hebben ingesteld.

U maakt een eenvoudig Node.js-script om een ​​bestand en map naar ZIP-indeling te comprimeren. Maak een nieuw Node-project op uw computer door de volgende opdrachten uit te voeren:

mkdir node-zip-archiver
CD node-zip-archiver
npm begin -y

Vervolgens moet u het Archiver-pakket in uw project installeren. Loop npm install archiver --save in uw terminal om het te installeren. Wanneer de installatie van het pakket is voltooid, maakt u een nieuw bestand aan in de projectdirectory en geeft u het een naam naar uw voorkeur, bijvoorbeeld. app.js of archiver.js.

De fs module handelt bestandsbewerkingen af, terwijl het Archiver-pakket de compressie van bestanden en mappen in ZIP-archieven afhandelt, vandaar dat het script beide modules vereist.

ZIP-archieven maken van bestanden

De volgende code is de implementatie van een functie die een bestand als argument accepteert en een gecomprimeerde ZIP-versie van het bestand maakt.

const archiver = vereisen('archiver')
const f = vereisen('fs')

// maak ZIP van bestand
const createZipFromFile = (bestand) => {
const bestandspad = __mapnaam + '/' + bestand
const uitvoer = fs.createWriteStream (bestandspad + '.zip')
const archiveren = archiveren('ritsen', {
zlib: { niveau: 9 } // stel het compressieniveau in op het hoogste
})

archive.pipe (uitvoer);
archief.bestand (filePath, { naam: bestand })
archiveren.afronden()
}

De functie neemt de bestandsnaam van het te comprimeren bestand en genereert een uitvoerbestand met een vergelijkbare naam (met als enige verschil de toevoeging van de ZIP-bestandsextensie).

Vervolgens genereert de functie een nieuw archief met het compressieniveau ingesteld op 9 (hoogste) en gebruikt het pijp functie om de uitvoerstromen van het archief over te dragen naar de invoer van het uitvoerbestand.

De bestand functie voegt een bestand toe aan het archief. Het accepteert het bestandspad als een parameter en een optioneel opties parameter waar u de eigenschappen van het bestand in het archief kunt specificeren.

De naam optie geeft de naam aan van het bestand in het archief. Als de optie niet is opgegeven bij het toevoegen van een bestand aan het archief, plaatst Archiver het bestand in het archief op basis van het oorspronkelijke pad, waarbij de directorystructuur behouden blijft.

Wanneer het echter expliciet wordt opgegeven, voegt Archiver het bestand toe aan het archief zonder het oorspronkelijke pad, waardoor aangepaste naamgeving en organisatie binnen het archief mogelijk is.

ZIP-archieven maken van mappen

Het proces van het maken van ZIP-archieven uit mappen verschilt niet veel van dat voor bestanden. Het belangrijkste verschil is het gebruik van het Archiver-pakket map functioneren in tegenstelling tot bestand in de vorige functie.

Hieronder ziet u de implementatie van een functie om een ​​map te comprimeren tot een ZIP-archief.

// maak ZIP vanuit map
const createZipFromFolder = (map) => {
const mapPath = __mapnaam + '/' + map
const uitvoer = fs.createWriteStream (folderPath + '.zip')

const archiveren = archiveren('ritsen', {
zlib: { niveau: 9 } // stel het compressieniveau in op het hoogste
})

archive.pipe (uitvoer)
archive.directory (folderPath, vals)
archiveren.afronden()
}

De map functie neemt het mappad als eerste argument en een vlag als tweede argument. De vlag bepaalt de plaatsing van de map in het archief.

Wanneer de vlag is ingesteld op vals, bevat het resulterende archief alleen de inhoud van de map, met uitzondering van de map zelf. Maar als de vlag is ingesteld op WAAR, zal Archiver de map zelf opnemen in het gegenereerde archief

Als u wilt voorkomen dat de locatie waar u uw archief uitpakt, besmet raakt met bestanden uit het gecomprimeerde archief, moet u nadenken over het instellen van de vlag optie om WAAR. U kunt dit echter instellen op vals, als het beter bij uw doeleinden past.

Bestanden decomprimeren in Node.js

Het proces van het uitpakken van ZIP-bestanden in Node.js heeft meerdere benaderingen en er zijn verschillende bibliotheken beschikbaar voor gebruik, maar in dit artikel wordt het Unzipper-pakket gebruikt.

Voer de volgende opdracht uit in uw terminal om het Unzipper-pakket in uw project te installeren.

npm install unzipper --save

Nadat u het pakket hebt geïnstalleerd, importeert u het in uw code en implementeert u de ZIP-extractiefunctie die wordt weergegeven in de onderstaande code:

const uitpakken = vereisen("uitritsen")

// functie om ZIP-bestand uit te pakken
const extractZip = asynchroon (bestand) => {
const bestandspad = __mapnaam + '/' + bestand
const outputPath = __dirnaam + '/uitgepakt'
wachten fs.createReadStream (bestandspad)
.pijp (unzipper. Extract({ pad: outputPath }))
.belofte()
}

De extractZip functie is een asynchrone functie die een leesstroom creëert om de inhoud van het ZIP-bestand te lezen, en het bestand uitpakt naar het opgegeven uitvoerpad (het creëert de geëxtraheerd map als deze niet bestaat).

In het geval van decomprimeren of uitpakken is het niet nodig om verschillende functies voor bestanden en mappen te definiëren, aangezien een ZIP-archief een bestand is, ongeacht de inhoud ervan.

Hieronder staat een functie die u aan de applicatie kunt toevoegen om de functies die u tot nu toe heeft gemaakt te testen:

(asynchroonfunctie () {
const bestand = 'test.pdf'
const map = 'testmap'
const zipbestand = 'test.pdf.zip'
createZipFromFile (bestand)
troosten.log('ZIP-archief succesvol gemaakt van bestand')
createZipFromFolder (map)
troosten.log('ZIP-archief succesvol aangemaakt vanuit map')
wachten extractZip (zipbestand)
troosten.log('ZIP-archief succesvol uitgepakt')
}) ()

Alle voorgaande functies zijn JavaScript-pijlfuncties, maar de bovenstaande functie is anders omdat het een Onmiddellijk aangeroepen functie-expressie Dat kapselt de code in erin en voert het onmiddellijk uit.

Bestandscompressie is gunstig bij het bouwen van efficiënte applicaties

Het moet altijd een doel zijn om uw applicaties zo efficiënt mogelijk te maken om gebruikers beter van dienst te zijn en een plezierige gebruikerservaring te behouden.

In scenario's waarin u veel bestanden binnen uw toepassing moet overbrengen, kunt u overwegen de bestanden tijdens het verzenden te comprimeren en decomprimeren. De meeste moderne programmeertalen bieden ondersteuning om bestanden efficiënt te comprimeren en decomprimeren.