Es ist 2017 (26. Oktober, um genau zu sein).
Für eine alte und allgegenwärtige Technologie wie Unzip würde ich erwarten, dass es eine ziemlich beliebte, ausgereifte Unzip-Bibliothek von node.j gibt, die "stagniert" und "nicht gepflegt" ist, weil sie "vollständig" ist.
Die meisten Bibliotheken scheinen jedoch entweder völlig schrecklich zu sein oder erst vor wenigen Monaten Commits zu haben. Das ist ziemlich besorgniserregend ... also habe ich mehrere Entpackungsbibliotheken durchgesehen, ihre Dokumente gelesen und ihre Beispiele ausprobiert, um WTF herauszufinden. Zum Beispiel habe ich Folgendes versucht:
Top Empfehlung: yauzl
Funktioniert hervorragend für vollständig heruntergeladene Dateien. Nicht so gut zum Streamen.
Gut dokumentiert. Funktioniert gut. Macht Sinn.
2. Wahl: node-stream-zip
Antelles node-stream-zip
scheint das Beste zu sein
Installieren:
npm install --save node-stream-zip
Verwendung:
'use strict';
var StreamZip = require('node-stream-zip');
var zip = new StreamZip({
file: './example.zip'
, storeEntries: true
});
zip.on('error', function (err) { console.error('[ERROR]', err); });
zip.on('ready', function () {
console.log('All entries read: ' + zip.entriesCount);
});
zip.on('entry', function (entry) {
var pathname = path.resolve('./temp', entry.name);
if (/\.\./.test(path.relative('./temp', pathname))) {
console.warn("[zip warn]: ignoring maliciously crafted paths in zip file:", entry.name);
return;
}
if ('/' === entry.name[entry.name.length - 1]) {
console.log('[DIR]', entry.name);
return;
}
console.log('[FILE]', entry.name);
zip.stream(entry.name, function (err, stream) {
if (err) { console.error('Error:', err.toString()); return; }
stream.on('error', function (err) { console.log('[ERROR]', err); return; });
mkdirp(path.dirname(pathname, function (err) {
stream.pipe(fs.createWriteStream(pathname));
});
});
});
Sicherheitswarnung :
Ich bin mir nicht sicher, ob dies entry.name
nach böswillig gestalteten Pfaden sucht, die falsch aufgelöst werden (z. B. ../../../foo
oder /etc/passwd
).
Sie können dies leicht selbst überprüfen, indem Sie vergleichen /\.\./.test(path.relative('./to/dir', path.resolve('./to/dir', entry.name)))
.
Vorteile : (Warum denke ich, dass es das Beste ist?)
- kann normale Dateien entpacken (vielleicht nicht einige verrückte mit seltsamen Erweiterungen)
- kann streamen
- scheint nicht die ganze Zip laden zu müssen, um Einträge zu lesen
- hat Beispiele in normalem JavaScript (nicht kompiliert)
- beinhaltet nicht die Küchenspüle (dh URL-Laden, S3 oder DB-Schichten)
- verwendet vorhandenen Code aus einer beliebten Bibliothek
- hat nicht zu viel sinnlosen Hipster oder Ninja-Foo im Code
Nachteile :
- Schluckt Fehler wie ein hungriges Nilpferd
- Wirft Zeichenfolgen anstelle von Fehlern (keine Stapelspuren)
zip.extract()
scheint nicht zu funktionieren (daher habe ich zip.stream()
in meinem Beispiel verwendet)
Zweiter Platz: Node-Unzipper
Installieren:
npm install --save unzipper
Verwendung:
'use strict';
var fs = require('fs');
var unzipper = require('unzipper');
fs.createReadStream('./example.zip')
.pipe(unzipper.Parse())
.on('entry', function (entry) {
var fileName = entry.path;
var type = entry.type;
console.log();
if (/\/$/.test(fileName)) {
console.log('[DIR]', fileName, type);
return;
}
console.log('[FILE]', fileName, type);
entry.pipe(process.stdout);
});
Vorteile :
- Scheint ähnlich zu funktionieren
node-stream-zip
, aber weniger Kontrolle
- Eine funktionellere Gabel von
unzip
- Scheint eher seriell als parallel zu laufen
Nachteile :
- Küchenspüle viel? Enthält nur eine Menge Dinge, die nichts mit dem Entpacken zu tun haben
- Liest die gesamte Datei (nach Chunk, was in Ordnung ist), nicht nur zufällige Suchvorgänge