我已经完成了相当多的谷歌搜索,并且做得很短。
我目前有一个Lambda函数,它从ftp(使用promise-ftp)流式传输文件,然后将其传送到s3(使用s3-streams)。这很好用。
我遇到过压缩文件的问题,我想在将它们上传到s3之前将其解压缩。我很幸运能够使用任何解压缩实用程序(这些实用程序都只是在引擎盖下解压缩)来处理本地文件。我有更糟糕的运气来解压缩(最好的情况是,我已经让它在测试期间在本地机器上以相同的名称递归保存文件)。
我尝试的相关代码是:
stream.pipe(unzip.Extract({path: '/tmp/'}).pipe(toS3Stream)
这给了我ENOENT。 unzip.Parse()同样的事情给了我“不可读”的错误。我有取消链接权限错误。我不知所措......
我愿意暂时将物品保存到lambda,但我似乎无法让它工作。
编辑:另外,要非常清楚:这些是 .zip 文件,而不是.gz,因此zlib无效。
答案 0 :(得分:2)
显然,使用if / else块的node-unzip示例是我的问题。以下工作(在本地和Lambda上测试,包含30多个文件):
ftp.connect({ host: ftpHost, user: ftpUser, password: ftpPassword })
.then(serverMessage => {
return ftp.get('/directory/' + fileName);
})
.then(stream => {
return new Promise((res, rej) => {
logger.info('Streaming file from FTP')
stream.once('error', rej);
stream.once('close', res);
stream.pipe(FS.createWriteStream('/tmp/'+fileName));
});
}).then(() => {
logger.info('Closing FTP connection')
// Unzip the file and pipe it to S3
FS.createReadStream('/tmp/'+fileName).pipe(UNZIP.Parse())
.on('entry', obj => obj.pipe(toS3Stream))
.on('close', () => {
resolve('File unzipped and written to S3.')
})
resolve('FTP closed');
return ftp.end();
})