2012-07-08 77 views
3

我用回形针将文件发送到S3,我想知道每个用户使用了多少空间占用。检查文件夹大小在Ruby on Rails的3

对于每个用户i都有一个文件夹用户/:ID /文件/。

我可以在我的数据库中注册当我保存每个文件需要多少空间,但我优先直接在S3检查它,有一个简单的方法吗?

回答

3

我不知道该算作容易和心灵,你我从文档这样做,但...

回形针使用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元数据的格式。据this post名称应具有/user/:id/files/格式,但我不知道怎么的其他物品(例如user)数字在它。

当你稍微挖掘一下,你或许可以改进,但我认为总体思路就在那里。

我得到这个从这些链接:

AWSRubySDK

Bucket

Bucket.objects

S3Object

S3Object.metadata

S3Object.metadata(name)

S3Object.content_length

+1

为此,您可以更快地通过这样的: AWS :: S3 :: Bucket.objects.with_prefix('/用户//:id //文件/')。做 – 2014-04-22 23:28:29

+0

辉煌。 +1来解释,而不是只是抛出一个解决方案,+2的参考链接。 – 2014-07-31 21:34:58

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) 
}