我正在使用paperclip将文件发送到S3,我想知道每个用户消耗多少空间。
对于每个用户,我有一个文件夹user /:id / files /.
我可以在我的数据库中注册每个文件在保存时节省多少空间,但我更喜欢直接在S3上查看,有一种简单的方法吗?
答案 0 :(得分:3)
我不确定这很简单,请注意我从文档中这样做但是......
Paperclip使用aws-sdk,所以如果你直接使用它:
size = 0
AWS::S3::Bucket.objects.each do |object| #object should be an S3Object
if object.metadata(name) =~ /user//:id//files/
size += object.content_length #in bytes
end
end
您应该结束每个用户使用的总字节数。我唯一不确定的是对象/文件的name
元数据的格式。根据{{3}},该名称应采用/user/:id/files/
格式,但我不确定其他项目(例如user
)是如何形成的。
当你深入挖掘时,你可能会改进这一点,但我认为总体思路就在那里。
我从这些链接中得到了这个:
答案 1 :(得分:2)
在@ ScottJShea的答案之上,您可以使用with_prefix(prefix)
- 方法:
size = 0
AWS::S3::Bucket.objects.with_prefix('/user//:id//files/').each do |s3_object|
size += s3_object.content_length
end
或:
AWS::S3::Bucket.objects.with_prefix('/user//:id//files/').inject(0) {
|sum, s3_object| sum + s3_object.content_length
}
此外:
如果你正在迭代可能被删除的对象,你会看到一个例外,你可以像这样拯救它:
AWS::S3::Bucket.objects.with_prefix('/user//:id//files/').inject(0) {
|sum, s3_object| sum + (s3_object.content_length rescue 0)
}