2013-02-12 136 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),是很容易使用。我很惊讶它没有那么多的下载,因为它是我发现支持密码的唯一一个。

相关问题