Aws :: S3未定义的方法'with_prefix'在:: Resource上

时间:2015-01-13 03:44:17

标签: ruby-on-rails ruby amazon-web-services amazon-s3 aws-sdk

所以,首先,我会告诉你我想要完成的事情。我在S3上主持了一堆照片。他们是汽车照片,由VIN组织。在创作时,我并不总是有VIN,所以我做了一个假的。稍后,当使用正确的VIN更新时,我想更新S3上的文件夹名称。无法在S3中重命名内容,因此我必须使用新名称进行复制,并删除原始内容。唷!现在谈谈我如何失败......

creds = ::Aws::Credentials.new(Settings.aws.access_key_id, Settings.aws.secret_access_key)
s3 = ::Aws::S3::Client.new(region: 'us-west-1', credentials: creds)
bucket = Settings.aws.bucket
s3.copy_object(bucket: bucket, copy_source: "#{bucket}/foo", key: 'bar')
s3.delete_object(bucket: bucket, key: "#{bucket}/foo")

调用copy_object时,这不起作用... Aws::S3::Errors::NoSuchKey: The specified key does not exist.。 copy_source是一个文件夹,所以它不像常规对象那样工作,很好。

所以,我环顾四周,发现我必须打电话:

s3 = ::Aws::S3::Resource.new(region: 'us-west-1', credentials: creds)
bucket = bucket = s3.bucket(Settings.aws.bucket)
bucket.objects.with_prefix('foo/').each do |object|
  object.copy_from(copy_source: "#{bucket}/foo")
end

这不起作用......请注意我现在正在调用::Resource,因为我不知道如何从::Client获取存储桶。在上面,我得到NoMethodError: undefined method 'with_prefix' for #<Aws::Resources::Collection:0x007fad587255a8>让我感到困惑,因为我读到的所有内容似乎都指向了这个解决方案。

我正在使用AWS SDK的v2。不确定我是否在关注v1解决方案?

我不知道copy_from是如何工作的,说实话......我真正想要的是copy_to,它似乎不在文档中。

aws-sdk-core-ruby github

aws sdk docs

2 个答案:

答案 0 :(得分:4)

aws-sdk v2中'bucket'类的'objects'方法返回Collection ObjectSummary(参见:http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Bucket.html#objects-instance_method)。

要查询具有前缀的对象列表,您应该使用:

bucket.objects({prefix: 'some_prefix'})

答案 1 :(得分:0)

我用

bucket.objects.find_all { |object| object.key.include?('foo/') }

for aws sdk v2