AWS SDK JS S3 getObject流元数据
我有类似于以下代码将S3对象作为响应使用Express管道返回客户端,这是完美的。
const s3 = new AWS.S3();
const params = {
Bucket: 'myBucket',
Key: 'myImageFile.jpg'
};
s3.getObject(params).createReadStream().pipe(res);
问题是,我希望能够访问从S3返回的响应中的一些属性,例如LastModified
,ContentLength
,ETag
等。我想使用这些属性作为响应发送到客户端,以及记录信息。
由于它正在创建一个流,我无法弄清楚如何获得这些属性。
我曾考虑过单独的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文档,它看起来不可能。还有另一种方法来实现这样的目标吗?
回答如下:我发现并测试了以下内容。有用。
按照: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()
}