不知何故,我想为用户获取文件夹的总大小。目前,我正在获取内存中的所有对象,然后循环所有对象以添加大小。
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=="
}
你只需要添加所有的尺寸。
第三种解决方案
若文件是从您的平台上传的,那个么最好将内容大小保存在数据库中的某个位置,然后运行查询来获取大小。