我需要在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對象創建事件與對象元數據更新
- 5. s3對象元數據lambda函數
- 6. django:使用ManyToMany批量更新對象
- 7. AWS Lambda函數和S3 - 僅當對象發生更改時才更改S3中的對象的元數據
- 8. 如何使angular.js顯示數據對象更新後的更新
- 9. 批量更新使用導軌中的對象的對象
- 10. 使用botocore更改對象元數據
- 11. 使用CURL的元數據創建S3對象失敗
- 12. 檢索S3對象元數據(NodeJS API)的最新方法
- 13. S3複製對象與新的元數據
- 14. 更新S3文件刪除元數據
- 15. 在s3中更新元數據
- 16. 更新具有非英文值的Amazon S3對象的元數據
- 17. 如何使用YAML更新已經實例化的Ruby對象?
- 18. 更改S3對象上的元數據(上次修改)
- 19. 如何更新現有Amazon S3文件的元數據?
- 20. 在S3中上傳大塊對象的同時更新元數據
- 21. 如何使用setState更新對象數組中的對象
- 22. 如何使用字符串中的數據更新JavaScript對象?
- 23. 如何使用Xamarin更新Parse.com數據庫中的對象?
- 24. 如何更新託管對象數據?
- 25. 如何批量單元測試Ruby中的對象集合?
- 26. boto3 S3:更新對象上的`expiry-date`
- 27. 如何使用php-sdk更新對象? (需要參數對象)
- 28. 如何使用EntityFramework將對象更新保存到數據庫?
- 29. 使用來自JSON對象的值批量更新數據庫表
- 30. 如何使用sql oracle更新批量數據的CLOB列?
此處的更多討論: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