2013-02-12 20 views
5

Ho bisogno di creare un file ZIP in node.js, protetto da una password.Generare un file ZIP protetto da password in node.js

Sto usando il modulo "node-zip", che purtroppo non supporta la protezione con password:

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

Guardando gli altri moduli di nodo per creare file ZIP, non ho trovato alcuna che supportano la protezione tramite password.

+1

Google "crea nodo zip js"? Prova http://stackoverflow.com/questions/5754153/zip-archives-in-node-js Dopo aver letto il primo link sembra che la generazione di uno strumento da riga di comando sia la strada da percorrere. –

risposta

7

Se lavori su Linux, puoi farlo con l'aiuto di zip (utility della riga di comando nella maggior parte delle distribuzioni di Linux). Basta includere quanto segue nella tua app.

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 
}); 

Se si vuole comprimere una cartella appena messo un altro argomento 'r', prima che il percorso della cartella invece di percorso del file.

Ricorda che questo genera un thread separato, dal processo principale, quindi non è bloccante. Per maggiori informazioni su child_process guarda qui http://nodejs.org/api/child_process.html

+0

Le tue soluzioni sembrano essere ok, ma ho bisogno di creare il file "al volo", voglio dire che i file non esistono nel file system (contengono dati sensibili). Per quanto ne so, non è possibile passare a comando zip una struttura di file con contenuto, giusto? – greuze

+1

Intendi comprimere i dati che hai nella variabile, non nel file. Zip accetta anche un trattino singolo ("-") come nome di un file da comprimere, nel qual caso leggerà il file dallo standard input. Puoi semplicemente scrivere il contenuto del file in stdin del processo figlio generato zip.stdin.write (data); Cerca gli esempi di stdin nella stessa pagina. http://nodejs.org/api/child_process.html#child_process_child_stdin – user568109

+0

Ho bisogno di scrivere due file all'interno dello zip, con nomi concreti (ho provato con "-" come nome file, ma il nome rimane "-" all'interno del file zip). Ho paura di dover usare una directory temporanea per decomprimere i file che ho creato con node-zip, e quindi comprimere di nuovo con il comando zip usando la password :( – greuze

0

La soluzione che sto utilizzando (io non un modo migliore per farlo) è:

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); 
    } 
}); 

Si genera un file zip temporaneo (senza password), e poi con diversi comandi, upzip, zip con password e rimuovi file temporanei.

2

Per tutti coloro che finisce qui, come ho fatto io, ho provato diversi pacchetti nel nodo, ma finito per usare questo: https://www.npmjs.com/package/minizip-asm.js

Esso supporta le password (utilizzando AES) ed è veramente facile da usare. Sono sorpreso che non abbia molti download dato che è l'unico che ho trovato password di supporto.

Problemi correlati