Unzippen mit Javascript? Wer sollte sowas wollen? Egal! Es geht, reicht das als Begründung? Und das garnicht mal so schlecht. Wie üblich schmeiße ich gleich mit Code um mich:
<script src="ZipFile.complete.js"></script> <script> var zipFile = new ZipFile("zipfile.zip", readingDoneCallback); function readingDoneCallback(zip) { console.log("Zipfile reading finished! " + zip.entries.length + " files found in zip"); for (var i = 0; i < zip.entries.length; i++) { zip.entries[i].extract(extractCallback); } }; function extractCallback(entry, entryContent) { var filename = entry.name, csize = entry.compressedSize, ucsize = entry.uncompressedSize; console.log("File " + filename + " - comp.: " + csize + ", uncomp.: " + ucsize + "byte"); console.log("File-Content: " + entryContent); } </script>
Simpler Aufbau, logische Implementierung. Alles was zu dieser Magie nötig ist, ist eine 64KB große Javascript-Datei, die auf Binärebene fleißig Bytes umhershiftet.
Geht nur mit handelsüblichen Zip-Dateien und auch nur entpacken ist möglich. Die Originalquelle der Library ist diese, eine Readme zur Library gibts auch. Das Ganze ist vollkommen unabhängig von jQuery oder anderen JS-Libraries. Übrigens war der Initiator eine Frage auf Stackoverflow, die der gute Herr Dino Chiesa zum Anreiz genommen hat, da „mal eben was zu schreiben“ ;).
Zum Ausprobieren müsst ihr das Ganze über einen Webserver laufen lassen, da die Zip-Datei per XHR und GET (nix PHP) geladen wird. Wer es mal selbst ausprobieren will, schnappt sich am Besten die ZipFile.complete.js von hier und nimmt meinen Codeschnippsel von oben, knallt das auf nen Webserver und testet. Die Demo vom Autor selbst ist grauenvoll undurchsichtig.
Auch wenn der Nutzen erstmal begrenzt zu sein scheint, kann man das mal im Hinterkopf behalten.
[Update: Bei einer Google Nachlese läuft mir grad noch eine zweite Implementierung über den Weg, die sogar Archive erstellen kann: JSZip. Scheint auf den ersten Blick auch sehr brauchbar zu sein, vielleicht ergänze ich den Post noch etwas]
Hm, ist das nicht arschlahm im Vergleich zu einer serverseitigen Lösung? (Ich hab es nicht probiert)
jap. Ist es. Bei 2KB Files mags noch auszuhalten sein aber sobald man was ernsthaftes machen möchte, beginnts weh zu tun. Außerdem hat man in dem Moment, in dem man auf die Clientseite geht auch gleich wieder mit unterschiedlichen Auffassung von Javascript in den Browsern zu tun. Mir fällt so ad-hoc kein sinnvoller Anwendungsfall ein, bei dem man nicht die Möglichkeit hat, den Spaß auf der Serverseite berechnen zu lassen.
Wäre es hier nicht sinnvoll Webworker einzusetzen?
Schöner Punkt! Wenn du ein homogenes Browserumfeld hast (Intranet / Mobile-Devices) könnte das sogar eine Paradedisziplin für Webworker sein.
Fragt sich nur wofür? zip ist doch sogar im nackigen Windoof dabei.
Z.B. kann man das dafür verwenden, wenn man große Daten an ein Smartphone mit GPRS-Datenanbindung senden möchte und man nur die Möglichkeit hat HTML 5 einzusetzen. Dann wäre es sehr praktisch, wenn man anstatt 1,5MB nur 150Kb an diesen senden bräuchte und er die Daten entpacken könnte.
Dafür gibt’s wohl eher Transfer-Kompression wie gzip oder deflate.