2013-02-12 24 views
5

Bir parola ile korunan node.js dosyasında bir ZIP dosyası oluşturmam gerekiyor.node.js içinde parola korumalı bir ZIP dosyası oluşturun

Ben ne yazık ki şifre korumasını desteklemediği, "düğüm-zip" modülü kullanıyorum:

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

Looking diğer düğüm modülleri ZIP dosyaları oluşturmak için, şifre koruması destekleyen herhangi bulamadı.

+1

Google "create zip node js"? Http://stackoverflow.com/questions/5754153/zip-archives-in-node-js 'yi deneyin. İlk bağlantıyı okuduktan sonra bir komut satırı aracının ortaya çıkması gibi görünüyor. –

cevap

7

Linux üzerinde çalışıyorsanız, bunu zip yardımıyla yapabilirsiniz (çoğu linux dağıtımında komut satırı yardımcı programı). Sadece uygulamanıza aşağıdakileri ekleyin.

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

yerine dosya yolunun klasör yolunun önce sadece başka argüman koymak '-r' bir klasör zip istiyorsanız.

Bu işlemin ana işlemden ayrı bir iş parçacığı oluşturduğunu unutmayın, bu nedenle engellenmez. child_process hakkında daha fazla bilgi için buraya http://nodejs.org/api/child_process.html

+0

Çözümleriniz tamam gibi görünüyor, ancak "anında", yani dosya sisteminde bulunmayan dosyaların (hassas veri içerdikleri) olması gerekiyor. Bildiğim kadarıyla, zip komutunu içerikli bir dosya yapısını geçemezsiniz, değil mi? – greuze

+1

Dosyadaki değişken değil, sahip olduğunuz verileri sıkıştırmak istiyorsunuz. Zip ayrıca sıkıştırılacak bir dosyanın adı olarak tek bir çizgi ("-") kabul eder, bu durumda dosyayı standart girişten okuyacaktır. Dosya içeriklerini, sadece yazılan çocuk süreçleri olan zip.stdin.write (data) stdin dosyasına yazabilirsiniz; Aynı sayfada stdin örneklerine bakın. http://nodejs.org/api/child_process.html#child_process_child_stdin – user568109

+0

Zip isminde iki dosya yazmam gerekiyor, somut isimlerle ("-" ile denedim dosya isminde, fakat isim "-" zip dosyasında kalıyor)). Korkarım ki, node-zip ile oluşturduğum dosyaları açmak için geçici bir dizin kullanmalı ve daha sonra parola :(ile zip komutu ile tekrar sıkıştırmalıyım – greuze

0

kullanıyorum çözeltisi (bunu yapmak için daha iyi bir yol yoktur) 'dir bak:

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

O (şifresiz) bir geçici zip dosyası oluşturur, ve sonra birkaç komut ile, upzip, şifreyle zip ve geçici dosyaları kaldırın. Benim yaptığım gibi, ben düğümünde birkaç paket çalıştı ama bu bir kullanarak sona erdi burada biter herkes için