流zip文件,管道解压缩,管道输出?

时间:2017-09-12 23:50:37

标签: node.js amazon-web-services amazon-s3 lambda stream

我已经完成了相当多的谷歌搜索,并且做得很短。

我目前有一个Lambda函数,它从ftp(使用promise-ftp)流式传输文件,然后将其传送到s3(使用s3-streams)。这很好用。

我遇到过压缩文件的问题,我想在将它们上传到s3之前将其解压缩。我很幸运能够使用任何解压缩实用程序(这些实用程序都只是在引擎盖下解压缩)来处理本地文件。我有更糟糕的运气来解压缩(最好的情况是,我已经让它在测试期间在本地机器上以相同的名称递归保存文件)。

我尝试的相关代码是:

stream.pipe(unzip.Extract({path: '/tmp/'}).pipe(toS3Stream)

这给了我ENOENT。 unzip.Parse()同样的事情给了我“不可读”的错误。我有取消链接权限错误。我不知所措......

我愿意暂时将物品保存到lambda,但我似乎无法让它工作。

编辑:另外,要非常清楚:这些是 .zip 文件,而不是.gz,因此zlib无效。

1 个答案:

答案 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();
                })