您是对的,官方SDK允许您修改对象元数据而无需再次上传.它的作用是复制对象,但这是在服务器上,因此您无需下载文件并重新上传.
包装器很容易实现,类似于
bucket.objects.each do |object|
object.metadata['content-type'] = 'application/json'
end
Run Code Online (Sandbox Code Playgroud)
在v2 API中,您可以使用Object#copy_from()或Object.copy_to()使用:metadata和:metadata_directive => 'REPLACE'选项更新对象的元数据,而无需从S3下载.
Joost's gist中的代码抛出了这个错误:
Aws :: S3 :: Errors :: InvalidRequest:此复制请求是非法的,因为它试图将对象复制到自身而不更改对象的元数据,存储类,网站重定向位置或加密属性.
这是因为默认情况下AWS会忽略:metadata提供的复制操作,因为它会复制元数据.:metadata_directive => 'REPLACE'如果我们想要就地更新元数据,我们必须设置选项.
见http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#copy_from-instance_method
这是我最近用于执行元数据更新操作的完整,有效的代码片段:
require 'aws-sdk'
# S3 setup boilerplate
client = Aws::S3::Client.new(
:region => 'us-east-1',
:access_key_id => ENV['AWS_ACCESS_KEY'],
:secret_access_key => ENV['AWS_SECRET_KEY'],
)
s3 = Aws::S3::Resource.new(:client => client)
# Get an object reference
object = s3.bucket('my-bucket-name').object('my-object/key')
# Create our new metadata hash. This can be any hash; in this example we update
# existing metadata with a new key-value pair.
new_metadata = object.metadata.merge('MY_NEW_KEY' => 'MY_NEW_VALUE')
# Use the copy operation to replace our metadata
object.copy_to(object,
:metadata => new_metadata,
# IMPORTANT: normally S3 copies the metadata along with the object.
# we must supply this directive to replace the existing metadata with
# the values we supply
:metadata_directive => "REPLACE",
)
Run Code Online (Sandbox Code Playgroud)
易于重复使用:
def update_metadata(s3_object, new_metadata = {})
s3_object.copy_to(s3_object,
:metadata => new_metadata
:metadata_directive => "REPLACE"
)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4314 次 |
| 最近记录: |