最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

AWS SDK JS S3 getObject流元数据

运维笔记admin14浏览0评论

AWS SDK JS S3 getObject流元数据

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返回的响应中的一些属性,例如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文档,它看起来不可能。还有另一种方法来实现这样的目标吗?

回答如下:

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

按照: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()  

}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论