有没有一个库可以用来解压带密码保护的文件(下载时网站要求我输入密码)?有很多库可以解压普通文件,但我找不到可以用密码解压的库。
这里我找到了一些有用的入门资料。但我不想使用
再次强调,我不想这样做,但我担心这是我的唯一选择,因此我尝试了以下内容:
这似乎非常接近我所需要的,但当文件被写入时,它只有解压选项列表。
我不确定输入是否有误,因为这看起来像是解压错误。或者我只是写错了内容。我本以为它会像通常从控制台执行一样 - 把所有文件添加到目录中。虽然我很想能够从缓冲区读取所有内容,但选项 - 并不似乎允许这样做,所以我将接受文件被添加到目录中。非常感谢任何提供建议的人!
这将只是把所有的文件解压到目录中,然后我就能够从那里读取它们了。我的错误在于第二个参数必须是一个数组。
child_process
和内置的Unix解压功能,但这可能是我的最后选择。我甚至愿意对加密代码进行自己的操作,但我甚至无法找出如何确定加密类型(因为我可以在终端中执行它,所以它似乎只是非常标准的)。再次强调,我不想这样做,但我担心这是我的唯一选择,因此我尝试了以下内容:
var fs = require('fs')
, unzip = require('unzip')
, spawn = require('child_process').spawn
, expand = function(filepath, cb) {
var self = this
, unzipStream = fs.createReadStream(filepath).pipe(unzip.Parse())
, xmlData = '';
unzipStream.on('entry', function (entry) {
var filename = entry.path;
// first zip contains files and one password protected zipfile.
// Here I can just do pipe(unzip.Parse()) again, but then i just get a giant encoded string that I don't know how to handle, so i tried other things bellow.
if(filename.match(/\.zip$/)){
entry.on('data', function (data) {
var funzip = spawn('funzip','-P','ThisIsATestPsswd','-');
var newFile = funzip.stdin.write(data);
// more closing code...
然后我有点不知道该怎么做了。我尝试将newFile
写入文件,但只显示了[object]
。
接着我尝试了一些更简单的方法,将最后三行改为:
fs.writeFile('./tmp/this.zip', data, 'binary');
var newFile = spawn('unzip','-P','ThisIsATest','./tmp/this.zip');
console.log('Data: ' + data);
但是数据仅仅是一个没有用处的[object Object]
。我不知道接下来该怎么做,才能将这个新解压的文件变成一个可工作的文件或可读的字符串。
我对Node
非常陌生,其他进程触发的异步/监听器有点让人困惑,所以如果有任何不清楚的地方,请见谅。非常感谢您的帮助!
编辑:
我现在已经添加了以下代码:
var fs = require('fs')
, unzip = require('unzip')
, spawn = require('child_process').spawn
, expand = function(filepath, cb) {
var self = this
, unzipStream = fs.createReadStream(filepath)
.pipe(unzip.Parse())
, xmlData = '';
unzipStream.on('entry', function (entry) {
var filename = entry.path
, type = entry.type // 'Directory' or 'File'
, size = entry.size;
console.log('Filename: ' + filename);
if(filename.match(/\.zip$/)){
entry.on('data', function (data) {
fs.writeFile('./lib/mocks/tmp/this.zip', data, 'binary');
var newFile = spawn('unzip','-P','ThisIsATestPassword', '-','../tmp/this.zip');
newFile.stdout.on('data', function(data){
fs.writeFile('./lib/mocks/tmp/that.txt', data); //This needs to be something different
//The zip file contains an archive of files, so one file name shouldn't work
});
});
} else { //Not a zip so handle differently }
)};
};
这似乎非常接近我所需要的,但当文件被写入时,它只有解压选项列表。
UnZip 5.52 of 28 February 2005, by Info-ZIP. Maintained by C. Spieler. Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
Default action is to extract files in list, except those in xlist, to exdir;
file[.zip] may be a wildcard. -Z => ZipInfo mode ("unzip -Z" for usage).
-p extract files to pipe, no messages -l list files (short format)
-f freshen existing files, create none -t test compressed archive data
-u update files, create if necessary -z display archive comment
-x exclude files that follow (in xlist) -d extract files into exdir
modifiers: -q quiet mode (-qq => quieter)
-n never overwrite existing files -a auto-convert any text files
-o overwrite files WITHOUT prompting -aa treat ALL files as text
-j junk paths (do not make directories) -v be verbose/print version info
-C match filenames case-insensitively -L make (some) names lowercase
-X restore UID/GID info -V retain VMS version numbers
-K keep setuid/setgid/tacky permissions -M pipe through "more" pager
Examples (see unzip.txt for more info):
unzip data1 -x joe => extract all files except joe from zipfile data1.zip
unzip -p foo | more => send contents of foo.zip via pipe into program more
unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
我不确定输入是否有误,因为这看起来像是解压错误。或者我只是写错了内容。我本以为它会像通常从控制台执行一样 - 把所有文件添加到目录中。虽然我很想能够从缓冲区读取所有内容,但选项 - 并不似乎允许这样做,所以我将接受文件被添加到目录中。非常感谢任何提供建议的人!
我能够让它工作,可能不是最好的方式,但至少使用这行代码可以实现:
var newFile = spawn('unzip', [ '-P','ThisIsATestPassword', '-d','./lib/tmp/foo','./lib/mocks/tmp/this.zip' ])
这将只是把所有的文件解压到目录中,然后我就能够从那里读取它们了。我的错误在于第二个参数必须是一个数组。
console.log('Data: ', data);
。您正在连接字符串和对象,因此对象转换为字符串[object Object]
。 - Alexey Ten_events: {data: function}
。如何触发该数据事件?我尝试了data.triggerEvent('data')
,但是它只显示出未定义方法 triggerEvent。 - CodySchaaf