Node.js:从S3下载文件并将其解压缩为字符串

4

我正在编写一个 AWS Lambda 函数,需要从 AWS S3 下载文件,解压文件并将内容以字符串形式返回。

我正在尝试以下代码:

function getObject(key){
  var params = {
    Bucket: "my-bucket",
    Key: key
  }
  return new Promise(function (resolve, reject){
    s3.getObject(params, function (err, data){
      if(err){
        reject(err);
      }
      resolve(zlib.unzipSync(data.Body))
    })
  })
}

但是出现了错误。
Error: incorrect header check
    at Zlib._handle.onerror (zlib.js:363:17)
    at Unzip.Zlib._processChunk (zlib.js:524:30)
    at zlibBufferSync (zlib.js:239:17)

数据看起来像这样。
{ AcceptRanges: 'bytes',
  LastModified: 'Wed, 16 Mar 2016 04:47:10 GMT',
  ContentLength: '318',
  ETag: '"c3xxxxxxxxxxxxxxxxxxxxxxxxx"',
  ContentType: 'binary/octet-stream',
  Metadata: {},
  Body: <Buffer 50 4b 03 04 14 00 00 08 08 00 f0 ad 6f 48 95 05 00 50 84 00 00 00 b4 00 00 00 2c 00 00 00 30 30 33 32 35 2d 39 31 38 30 34 2d 37 34 33 30 39 2d 41 41 ... > 
}
1个回答

2

Body缓冲区包含经过zip压缩的数据(这可以通过前几个字节进行识别),这不仅是纯zlib。

您需要使用一些zip模块来解析数据并提取其中的文件。其中一个库是yauzl,它具有fromBuffer()方法,您可以将其传递给缓冲区并获取文件条目。


我不确定我理解了你的回答。如果我在yauzl.fromBuffer中传递data.Body,我会在回调函数中得到一个ZipFile对象。那我该怎么使用它呢?由于zlib.unzipSync需要一个缓冲区,所以我不能将其传递给它。 - Mandeep Singh
1
该模块的自述文件描述了ZipFile。它还包含一个示例 - mscdex
你是否通过将缓冲区写入磁盘并尝试使用某些存档查看器打开它来验证数据的有效性? - mscdex
尝试其他的 zip 模块,npm 上有很多选择,比如 adm-zipunzipjszip 等等。 - mscdex
AdmZip 工作了!非常感谢!你在理解这个过程方面帮助很大。 - Mandeep Singh
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接