2013-02-12 6 views
5

Ich muss eine ZIP-Datei in node.js erstellen, durch ein Passwort geschützt.Erstellen Sie eine passwortgeschützte ZIP-Datei in node.js

I „node-zip“ Modul bin mit, dass leider nicht Passwortschutz unterstützt:

var zip = new require('node-zip')(); 
zip.file('test.file', 'hello there'); 
var data = zip.generate({base64:false,compression:'DEFLATE'}); 

Suchen andere Knotenmodule ZIP-Dateien zu erstellen, ich habe keine gefunden, die den Passwortschutz zu unterstützen.

+1

Google "create zip node js"? Versuchen Sie http://stackoverflow.com/questions/5754153/zip-archives-in-node-js Nach dem Lesen des ersten Links scheint es, ein Befehlszeilentool laichen ist der Weg zu gehen. –

Antwort

7

Wenn Sie unter Linux arbeiten, dann können Sie es mit Hilfe von Zip (Befehlszeilen-Dienstprogramm in den meisten Linux-Distributionen) tun. Fügen Sie einfach Folgendes in Ihre App ein.

spawn = require('child_process').spawn; 
zip = spawn('zip',['-P', 'password' , 'archive.zip', 'complete path to archive file']); 
zip .on('exit', function(code) { 
...// Do something with zipfile archive.zip 
...// which will be in same location as file/folder given 
}); 

Wenn Sie einen Ordner nur ein weiteres Argument setzen zip wollen ‚-r‘, vor dem Ordnerpfad statt Dateipfad.

Erinnern Sie sich daran, dass es einen separaten Thread vom Hauptprozess erzeugt, so dass es nicht blockiert. Für weitere Informationen über child_process hier http://nodejs.org/api/child_process.html

+0

Ihre Lösungen scheinen in Ordnung zu sein, aber ich muss die Datei "on the fly" erstellen, ich meine, die Dateien existieren nicht im Dateisystem (sie enthalten vertrauliche Daten). Soweit ich weiß, können Sie keine Dateistruktur mit Inhalt zip Befehl übergeben, oder? – greuze

+1

Sie wollen die Daten, die Sie haben, in Variablen, nicht in Dateien komprimieren. Zip akzeptiert auch einen einzelnen Bindestrich ("-") als den Namen einer Datei, die komprimiert werden soll. In diesem Fall wird die Datei von der Standardeingabe gelesen. Sie können den Dateiinhalt einfach in stdin des erstellten Child-Prozesses schreiben. Zip.stdin.write (data); Suchen Sie nach stdin-Beispielen auf derselben Seite. http://nodejs.org/api/child_process.html#child_process_child_stdin – user568109

+0

Ich muss zwei Dateien innerhalb der Zip, mit konkreten Namen (Ich versuchte mit "-" als Dateiname, aber der Name bleibt "-" in der Zip-Datei). Ich fürchte, ich muss ein temporäres Verzeichnis verwenden, um die Dateien, die ich mit Node-Zip erstellt habe, zu entpacken, und dann wieder komprimieren mit Zip-Befehl mit Passwort :( – greuze

0

Die Lösung Ich verwende (ich weiß nicht, einen besseren Weg, es zu tun) ist:

var contenido1 = 'contenido super secreto'; 
var contenido2 = 'otro contenido'; 
var password = 'pass'; 
var nombreFichero = 'fichero' 

var nodezip = new require('node-zip')(); 
var fs = require("fs"); 
nodezip.file('test1.txt', contenido1); 
nodezip.file('test2.txt', contenido2); 
var data = nodezip.generate({base64:false,compression:'DEFLATE'}); 
fs.writeFile(nombreFichero + '.zip', data, 'binary'); 

var exec = require('child_process').exec, 
    child; 

child = exec('unzip ' + nombreFichero + '.zip -d ' + nombreFichero + 
      ' && zip -junk-paths --password ' + password + ' ' + nombreFichero + '-p.zip ' + nombreFichero + '/*' + 
      ' && rm -rf ' + nombreFichero + ' && rm -f ' + nombreFichero + '.zip', 
    function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (error !== null) { 
     console.log('exec error: ' + error); 
    } 
}); 

Es erzeugt eine temporäre zip-Datei (ohne Passwort), und dann mit mehreren Befehlen, upzip, zip mit Passwort und temporäre Dateien entfernen.

2

Für alle, die hier enden wie ich es tat, ich mehrere Pakete in Knoten versucht, aber am Ende mit dieser: https://www.npmjs.com/package/minizip-asm.js

Es unterstützt Passwörter (AES) und ist wirklich einfach zu bedienen. Ich bin überrascht, dass es nicht so viele Downloads gibt, da es die einzige ist, die unterstützende Passwörter gefunden hat.