我正在使用回形针将文件发送到 S3,我想知道每个用户占用了多少空间。
对于每个用户,我都有一个文件夹 user/:id/files/。
我可以在我的数据库中注册每个文件在保存时需要多少空间,但我更喜欢直接在 S3 上检查它,有一个简单的方法吗?
我正在使用回形针将文件发送到 S3,我想知道每个用户占用了多少空间。
对于每个用户,我都有一个文件夹 user/:id/files/。
我可以在我的数据库中注册每个文件在保存时需要多少空间,但我更喜欢直接在 S3 上检查它,有一个简单的方法吗?
我不确定这算不算容易,请注意我是从文档中执行此操作的,但是...
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
对象/文件的元数据格式。根据这篇文章,名称应该具有/user/:id/files/
格式,但我不确定其他项目(例如user
)是如何融入其中的。
当您深入研究时,您可能会对此有所改进,但我认为总体思路就在那里。
我从这些链接中得到了这个:
在@ScottJShea 的回答之上,您可以使用with_prefix(prefix)
-method:
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)
}