13

S3 上の何百または何千ものオブジェクトのメタデータ (Content-Type) を変更する必要があります。Rubyでこれを行う良い方法は何ですか? 私が知る限り、 fog.ioでメタデータのみを保存する方法はなく、オブジェクト全体を再保存する必要があります。公式の SDK ライブラリを使用するには、この 1 つのタスクのためだけにラッパー環境を作成する必要があるようです。

4

5 に答える 5

7

そうです、公式の SDK を使用すると、オブジェクトのメタデータを再アップロードせずに変更できます。オブジェクトをコピーしますが、それはサーバー上にあるため、ファイルをダウンロードして再アップロードする必要はありません。

ラッパーは実装が簡単です。

bucket.objects.each do |object|
  object.metadata['content-type'] = 'application/json'
end
于 2012-02-21T10:13:26.567 に答える
5

v2 API では、Object#copy_from()またはObject.copy_to()とオプション:metadataを使用:metadata_directive => 'REPLACE'して、S3 からダウンロードせずにオブジェクトのメタデータを更新できます。

Joost の要点のコードは、次のエラーをスローします。

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",
)

簡単に再利用するには:

def update_metadata(s3_object, new_metadata = {})
  s3_object.copy_to(s3_object,
    :metadata => new_metadata
    :metadata_directive => "REPLACE"
  )
end
于 2016-08-26T01:13:42.177 に答える
4

今後の読者のために、Ruby aws-sdk v1 を使用した変更内容の完全なサンプルを次に示します ( aws-sdk v2 サンプルについては、このGistも参照してください)。

# 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
于 2015-02-23T08:30:34.680 に答える
3

いくつかの検索の後、これは私にとってはうまくいくようです

obj.copy_to(obj, :metadata_directive=>"REPLACE", :acl=>"public-read",:content_type=>"text/plain")
于 2017-06-11T10:38:50.277 に答える