3

我正在使用回形针将文件发送到 S3,我想知道每个用户占用了多少空间。

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

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

4

2 回答 2

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对象/文件的元数据格式。根据这篇文章,名称应该具有/user/:id/files/格式,但我不确定其他项目(例如user)是如何融入其中的。

当您深入研究时,您可能会对此有所改进,但我认为总体思路就在那里。

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

AWSRubySDK

桶对象

S3对象

S3Object.元数据

S3Object.元数据(名称)

S3Object.content_length

于 2012-07-08T10:42:04.207 回答
2

在@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)
}
于 2014-04-22T23:49:05.217 回答