计算bucket文件夹中对象大小的有效方法



不知何故,我想为用户获取文件夹的总大小。目前,我正在获取内存中的所有对象,然后循环所有对象以添加大小。

let promises = []
// the format of Key is "storage/{USER ID}/docs"
for (const Key of keys) { 
promises.push(new Promise(resolve => {
engineS3.getObject({
Bucket: process.env.ENGINE_AWS_BUCKET,
Key
}, (e, data) => {
resolve(data)
})
}))
}
let docs = await Promise.all(promises)
let usedSpace = docs.reduce((x, y) => x + y.ContentLength, 0) / (1024 * 1024 * 1024)

对于2-3个文件(每个文件的大小在3mB到10mB之间(,它可以正常工作。但随着用户和文档数量的增长,它可能会因为资源不足而导致服务器崩溃。

不幸的是,没有简单的方法可以实现这一点,但您可以使用AWS CLI命令

第一个解决方案

从代码中运行以下命令。使用child_process或类似shelljs的npm包。在这种情况下,您还需要对CLI进行身份验证。

aws s3 ls s3://yourBucket/storage/{USER ID}/docs --recursive --human-readable --summarize

这将返回如下数据:

2013-09-02 21:37:53   10 Bytes a.txt
2013-09-02 21:37:53  2.9 MiB foo.zip
2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57  398 Bytes z.txt
Total Objects: 10
Total Size: 2.9 MiB

您可以从中解析总大小。

第二个解决方案

使用Node AWS SDK的ListObjectsV2方法。这里的问题是,它在一次调用中只返回1000个结果,并为下一页提供标记。您需要编写分页逻辑。

输出为:

{
Contents: [
{
Key: "example1.jpg",
// ... Other details
Size: 11,
},
{
Key: "example2.mp4",
// ... Other details
Size: 784335,
},
],
NextMarker: "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
}

你只需要添加所有的尺寸。

第三种解决方案

若文件是从您的平台上传的,那个么最好将内容大小保存在数据库中的某个位置,然后运行查询来获取大小。

相关内容

  • 没有找到相关文章

最新更新