在Ruby on Rails 3中检查amazon S3的文件夹大小

时间:2012-07-08 00:59:53

标签: ruby-on-rails-3 amazon-s3 paperclip

我正在使用paperclip将文件发送到S3,我想知道每个用户消耗多少空间。

对于每个用户,我有一个文件夹user /:id / files /.

我可以在我的数据库中注册每个文件在保存时节省多少空间,但我更喜欢直接在S3上查看,有一种简单的方法吗?

2 个答案:

答案 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)是如何形成的。

当你深入挖掘时,你可能会改进这一点,但我认为总体思路就在那里。

我从这些链接中得到了这个:

this post

AWSRubySDK

Bucket

Bucket.objects

S3Object

S3Object.metadata

S3Object.metadata(name)

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