所以,首先,我会告诉你我想要完成的事情。我在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
,它似乎不在文档中。
答案 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