2013-02-12 42 views
5

मुझे पासवर्ड द्वारा संरक्षित node.js में एक ज़िप फ़ाइल बनाने की आवश्यकता है।एक पासवर्ड संरक्षित ज़िप फ़ाइल उत्पन्न करें node.js

मैं "नोड जिप" मॉड्यूल का उपयोग कर रहा है, तो दुर्भाग्यवश पासवर्ड सुरक्षा का समर्थन नहीं करता: ज़िप फ़ाइलों को बनाने के

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

खोज रहे हैं अन्य नोड मॉड्यूल, मैं किसी भी है कि पासवर्ड सुरक्षा का समर्थन नहीं मिल गया है।

+1

Google "ज़िप नोड जेएस बनाएं"? Http://stackoverflow.com/questions/5754153/zip-archives-in-node-js का प्रयास करें, पहले लिंक को पढ़ने के बाद ऐसा लगता है कि कमांड लाइन टूल को घुमाने का तरीका है। –

उत्तर

7

यदि आप लिनक्स पर काम करते हैं तो आप इसे ज़िप की मदद से कर सकते हैं (अधिकांश लिनक्स वितरण में कमांड लाइन उपयोगिता)। बस आप में निम्नलिखित ऐप शामिल करें।

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

यदि आप किसी फ़ोल्डर को ज़िप करना चाहते हैं तो फ़ाइल पथ के बजाय फ़ोल्डर पथ से पहले एक और तर्क '-r' डालें।

इस प्रक्रिया को मुख्य प्रक्रिया से अलग थ्रेड याद रखें, इसलिए यह अवरुद्ध नहीं है। child_process अधिक जानकारी के लिए यहाँ देखो http://nodejs.org/api/child_process.html

+0

आपके समाधान ठीक दिखते हैं, लेकिन मुझे "फ्लाई पर" फ़ाइल बनाने की आवश्यकता है, मेरा मतलब है कि फाइलें फ़ाइल सिस्टम में मौजूद नहीं हैं (उनमें संवेदनशील डेटा है)। जैसा कि मुझे पता है, आप सामग्री के साथ फ़ाइल संरचना को ज़िप कमांड पास नहीं कर सकते हैं, है ना? – greuze

+1

आप फ़ाइल में नहीं, चर में जो भी डेटा है, उसे संपीड़ित करने का मतलब है। ज़िप भी एक डैश ("-") को संकुचित करने के लिए फ़ाइल के नाम के रूप में स्वीकार करता है, इस स्थिति में यह मानक इनपुट से फ़ाइल को पढ़ेगा। आप फ़ाइल सामग्री को spawned बाल प्रक्रिया zip.stdin.write (डेटा) के stdin में लिख सकते हैं; एक ही पृष्ठ पर stdin उदाहरणों की तलाश करें। http://nodejs.org/api/child_process.html#child_process_child_stdin – user568109

+0

मुझे ठोस नामों के साथ ज़िप के अंदर दो फाइलें लिखने की आवश्यकता है (मैंने फ़ाइल नाम के रूप में "-" के साथ प्रयास किया है, लेकिन नाम ज़िप फ़ाइल के अंदर "-" रहता है)। मुझे डर है कि मुझे नोड-ज़िप के साथ बनाई गई फ़ाइलों को अनजिप करने के लिए एक अस्थायी निर्देशिका का उपयोग करना होगा, और फिर पासवर्ड का उपयोग करके ज़िप कमांड के साथ फिर से संपीड़ित करना होगा :( – greuze

0

समाधान मैं उपयोग कर रहा हूँ (मैं यह करने के लिए एक बेहतर तरीका नहीं है) है:

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

यह एक अस्थायी ज़िप फ़ाइल (पासवर्ड के बिना) उत्पन्न करता है, और फिर कई आदेशों के साथ, upzip, पासवर्ड के साथ ज़िप और अस्थायी फ़ाइलों को हटा दें।

2

किसी को जो यहाँ समाप्त होता है जैसे मैंने किया था, मैं नोड में कई संकुल की कोशिश की लेकिन यह एक का उपयोग कर समाप्त हो गया के लिए: https://www.npmjs.com/package/minizip-asm.js

यह पासवर्ड (एईएस का प्रयोग करके) का समर्थन करता है और उपयोग करने के लिए वास्तव में आसान है। मुझे आश्चर्य है कि इसमें कई डाउनलोड नहीं हैं, यह केवल एकमात्र है जिसे मैंने पासवर्ड का समर्थन किया।