2013-02-12 138 views
5

我需要在node.js中創建一個ZIP文件,並由密碼保護。在node.js中生成受密碼保護的ZIP文件

我使用「節點-ZIP」模塊中,遺憾的是不支持密碼保護:

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

尋找其他節點模塊創建ZIP文件,我還沒有發現任何支持密碼保護。

+1

谷歌「創建zip節點js」?嘗試http://stackoverflow.com/questions/5754153/zip-archives-in-node-js閱讀第一個鏈接後,似乎產生命令行工具是要走的路。 – 2013-02-12 09:59:55

回答

7

如果你在linux上工作,那麼你可以在zip(大多數linux發行版中的命令行工具)的幫助下做到這一點。只需在您的應用中添加以下內容。

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

您的解決方案似乎沒問題,但我需要創建「即時」文件,我的意思是文件不存在於文件系統中(它們包含敏感數據)。 就像我知道的那樣,你不能將zip命令傳遞給一個帶有內容的文件結構,對吧? – greuze 2013-02-12 11:42:54

+1

你的意思是壓縮變量中的任何數據,而不是文件。 Zip也接受一個單一的破折號(「 - 」)作爲要壓縮文件的名稱,在這種情況下,它將從標準輸入中讀取文件。你可以將文件內容寫入生成的子進程的標準輸入zip.stdin.write(data);在同一頁面上查找stdin示例。 http://nodejs.org/api/child_process.html#child_process_child_stdin – user568109 2013-02-12 11:56:39

+0

我需要在zip中編寫兩個文件,具體名稱(我試着用「 - 」作爲文件名,但名稱在zip文件中仍然是「 - 」 )。 恐怕我必須使用一個臨時目錄來解壓我用n​​ode-zip創建的文件,然後用zip命令再次壓縮使用密碼:( – greuze 2013-02-12 12:22:10

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

它會產生一個臨時zip文件(無密碼)然後用幾個命令,上傳,用密碼壓縮並刪除臨時文件。

2

對於任何人誰在這裏結束了像我一樣,我試過幾個包在節點,但最終使用這一個:https://www.npmjs.com/package/minizip-asm.js

它支持密碼(使用AES),是很容易使用。我很驚訝它沒有那麼多的下載,因爲它是我發現支持密碼的唯一一個。

相關問題