AWS开发工具包JS S3 getObject流元数据

时间:2019-02-03 19:09:17

标签: javascript node.js amazon-web-services amazon-s3

我具有类似于以下代码的代码,可以使用Express将S3对象作为响应通过管道传递回客户端,

const s3 = new AWS.S3();
const params = {
    Bucket: 'myBucket',
    Key: 'myImageFile.jpg'
};
s3.getObject(params).createReadStream().pipe(res);

问题是,我希望能够访问从S3返回的响应中的某些属性,例如LastModifiedContentLengthETag等。我想使用这些属性作为标头发送给客户端,以及记录信息。

由于它正在创建流,因此我不知道如何获得这些属性。

我曾考虑过单独进行一次s3.headObject调用以获取所需的数据,但这似乎很浪费,最终会导致大量成本。

我还考虑过放弃整个流的想法,只是让它返回一个缓冲区,但是再次,当我不需要额外的内存时,这似乎是非常浪费的,并且由于以下原因,可能会增加更多的成本处理请求所需的额外服务器和处理每个请求所需的额外内存。


如何使用s3.getObject以及通常由s3.getObject返回的所有元数据和其他属性来获取流?


类似以下的东西将是惊人的:

const s3 = new AWS.S3();
const params = {
    Bucket: 'myBucket',
    Key: 'myImageFile.jpg',
    ReturnType: 'stream'
};
const s3Response = await s3.getObject(params).promise();
s3Response.Body.pipe(res); // where `s3Response.Body` is a stream
res.set("ETag", s3Response.ETag);
res.set("Content-Type", s3Response.ContentType);
console.log("Metadata: ", s3Response.Metadata);

但是根据S3文档,这似乎是不可能的。还有另一种方法可以达到这样的目的吗?

1 个答案:

答案 0 :(得分:2)

我发现并测试了以下内容。有用。

按照:Getting s3 object metadata then creating stream

function downloadfile (key,res) {

  let stream;

  const params = { Bucket: 'xxxxxx', Key: key }
  const request = s3.getObject(params);


    request.on('httpHeaders', (statusCode, httpHeaders) => {
        console.log(httpHeaders);
        stream.pipe(res)
        stream.on('end', () => { 
            console.log('were done')
        })
    })
    stream = request.createReadStream()  

}