我需要在S3上更改数百或数千个对象上的某些元数据(Content-Type)。用ruby做这件事的好方法是什么?据我所知,没有办法只保存与fog.io元数据,整个对象必须重新保存。似乎使用the official sdk library将需要我为这一个任务滚动一个包装环境。如何使用ruby更新一批S3对象的元数据?
回答
你是对的,官方的SDK可以让你修改的对象元数据而无需重新上传。它的功能是copy the object,但这是在服务器上,所以你不需要下载文件并重新上传。
一个包装很容易实现,像
bucket.objects.each do |object|
object.metadata['content-type'] = 'application/json'
end
对于未来的读者,这是一个使用Ruby的AWS-SDK V1改变的东西的一个完整样本(另见本Gist的AWS-SDK V2样品):
# Using v1 of Ruby aws-sdk as currently v2 seems not able to do this (broken?).
require 'aws-sdk-v1'
key = YOUR_AWS_KEY
secret = YOUR_AWS_SECRET
region = YOUR_AWS_REGION
AWS.config(access_key_id: key, secret_access_key: secret, region: region)
s3 = AWS::S3.new
bucket = s3.buckets[bucket_name]
bucket.objects.with_prefix('images/').each do |obj|
puts obj.key
# Add metadata: {} to next line for more metadata.
obj.copy_from(obj.key, content_type: obj.content_type, cache_control: 'max-age=1576800000', acl: :public_read)
end
在V2 API,你可以使用Object#copy_from()
或Object.copy_to()
与:metadata
和:metadata_directive => 'REPLACE'
选项,而从S3下载该更新对象的元数据。
在Joost's gist的代码引发此错误:
Aws::S3::Errors::InvalidRequest: This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.
这是因为通过默认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",
)
为了便于再利用:
def update_metadata(s3_object, new_metadata = {})
s3_object.copy_to(s3_object,
:metadata => new_metadata
:metadata_directive => "REPLACE"
)
end
要添加缓存控制使用:object.copy_to(object,cache_control:'public,max-age = 333333',metadata_directive:'REPLACE') – 2017-06-15 10:29:48
一些搜索后这似乎为我
obj.copy_to(obj, :metadata_directive=>"REPLACE", :acl=>"public-read",:content_type=>"text/plain")
工作
- 1. 如何使用python boto3更新AWS S3中现有对象的元数据?
- 2. 已有对象的Boto3 S3更新元数据
- 3. 如何使用Amazon S3 SDK更新元数据
- 4. s3对象元数据lambda函数
- 5. django:使用ManyToMany批量更新对象
- 6. AWS Lambda函数和S3 - 仅当对象发生更改时才更改S3中的对象的元数据
- 7. 如何使angular.js显示数据对象更新后的更新
- 8. 批量更新使用导轨中的对象的对象
- 9. 检索S3对象元数据(NodeJS API)的最新方法
- 10. 如何使用YAML更新已经实例化的Ruby对象?
- 11. 在S3中上传大块对象的同时更新元数据
- 12. 如何使用setState更新对象数组中的对象
- 13. 如何使用Xamarin更新Parse.com数据库中的对象?
- 14. 如何批量单元测试Ruby中的对象集合?
- 15. boto3 S3:更新对象上的`expiry-date`
- 16. 使用来自JSON对象的值批量更新数据库表
- 17. 如何使用sql oracle更新批量数据的CLOB列?
- 18. 如何使用PowerShell批量调用更新数据库
- 19. 如何在Ruby on Rails中计算和使用最新更新的对象?
- 20. 如何使用Java SDK更改S3对象的存储类?
- 21. 数据绑定到对象 - 如何更新对象/绑定?
- 22. 如何更新AWS S3存储桶中的对象属性
- 23. 如何用Firestore更新“对象数组”?
- 24. 如何使用getStream更新对象?
- 25. 如何使用DetailsView更新Linq对象?
- 26. 如何使用递归数据批量更新表
- 27. 新S3对象的通知
- 28. 如何更新对象的一部分
- 29. 用jquery更新数据对象
- 30. 如何在使用对象更改数组后更新页面?
此处的更多讨论:http://groups.google.com/group/ruby-fog/browse_thread/thread/e632fc61405bf04c – 2012-02-21 18:30:43
这只会添加带有x-amz-meta-前缀的元数据。是只添加一个普通的Content-Type元数据的方法吗? – serengeti12 2013-01-01 09:15:34