繁体   English   中英

AWS SDK JS S3 getObject 流元数据

[英]AWS SDK JS S3 getObject Stream Metadata

我有类似于以下的代码,用于将 S3 对象作为使用 Express 的响应通过管道传回客户端,该代码运行良好。

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 文档,这看起来不太可能。 有没有另一种方法可以实现这样的目标?

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

按照: 获取 s3 对象元数据然后创建流

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()  

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM