4

一部の S3 オブジェクトが S3 バケットにアップロードされた後、そのメタデータ フィールドを更新するスクリプトを実行しています。初期化時に、ファイル名を確認して content-type を設定しています。

def save_to_amazon(file, s3_object, file_name, meta_path)
  puts "uploaded #{file} to Amazon S3"
  content_type = set_content_type(file_name)
    s3_object.write(file.get_input_stream.read, :metadata => { :folders => meta_path}, :content_type => content_type)
end

この時点で、S3 コンテンツ タイプはこれらのオブジェクトに対して正常に機能します。後でメタデータを更新すると、問題が発生します。私はこのようなものを実行します:

s3_object.metadata['folders'] = "some string"

この時点でs3_objects.content_type、メタデータの更新後に実行すると、空の文字列が返されます。

s3_object.content_type =利用できません。

Rdocを読んでわかる限り、S3 ファイルをアップロードした後にコンテンツ タイプを割り当てる方法はありません。次のようなメタデータメソッドを使用してみました

s3.object.metadata['content_type'] = "some string"
s3.object.metadata['content-type'] = "some string"

これらはどちらも、オブジェクトの MIME タイプを更新する代わりに、新しいカスタム メタデータ属性を割り当てているようです。

これを設定する方法はありますか、それともファイルを完全に再アップロードする必要がありますか?

4

5 に答える 5

10

tkotisis 応答について詳しく説明するために、copy_to を使用して content-type を更新するために行ったことを次に示します。ここで参照されているように、s3object.head[:metadata] を使用して既存のメタデータを引き出してコピーすることができます。

amazon_bucket.objects.each do |ob|
    metadata = ob.head[:metadata]
    content_type = "foo/bar"
    ob.copy_to(ob.key, :metadata => metadata, :content_type => content_type)
end

編集

amazon_bucket.objects.each do |ob|
    metadata = ob.metadata
    content_type = "foo/bar"
    ob.copy_to(ob.key, :metadata{:foo => metadata[:foo]}, :content_type => content_type)
end
于 2012-11-15T14:07:03.350 に答える
7

サンプル コードはメモリ内オブジェクトのみを変更します。実際の S3 オブジェクトのメタデータを変更するには、現在のオブジェクトのコピー先キーを指定してコピー リクエストを発行します。

編集

ドキュメントによると

コピー操作を使用すると、オブジェクトをコピーして元のオブジェクトを削除することで、オブジェクトの名前を変更できます。

オブジェクトをコピーするときに、メタデータ値の一部を更新する必要がある場合があります。たとえば、ソース オブジェクトが標準ストレージを使用するように構成されている場合は、オブジェクト コピーに冗長性の低いストレージを使用することを選択できます。また、ソース オブジェクトに存在するユーザー定義のメタデータ値の一部を変更することもできます。コピー中にオブジェクトのユーザー構成可能メタデータ (システムまたはユーザー定義) のいずれかを更新することを選択した場合、メタデータ値の 1 つだけを変更する場合でも、すべてのユーザー構成可能メタデータを明示的に指定する必要があることに注意してください。リクエストのソース オブジェクトで。

試したことはありませんが、Ruby SDK を使用すると、おそらく

- (S3Object) copy_to(target, options = {})

方法

于 2012-11-15T11:29:45.143 に答える
3

gem "aws-sdk", "~> 2" (2.2.3) を使用しています

コンテンツ タイプが設定されていない現在のファイルがあると仮定します (コンテンツ タイプはデフォルトで「バイナリ/オクテット ストリーム」として設定されます)。

コンテンツ タイプ ファイルを確認する方法は?

RestClientを次のように使用する場合:

オブジェクトは Aws::S3::Object を意味します

bucket = Aws::S3::Bucket.new(bucket_name)
object = bucket.object(key)

RestClient.head(object.presigned_url(:head)) do |resp|
  puts resp.headers
  puts resp.headers[:content_type]
end

コンテンツ タイプ ファイルを変更する方法

私の場合、現在のオブジェクトが「binary/octet-stream」である「image/jpeg」にコンテンツタイプを変更したいので、

object.copy_from(
  object, 
  content_type: 'image/jpeg', 
  metadata_directive: 'REPLACE'
)
于 2015-12-02T07:11:42.277 に答える
2

ACL を :public read に設定していることを確認してください。そうしないと、コピー後にファイルが使用できなくなります。

これは私にとってはうまくいきました:

bucket.objects.with_prefix('my_assets').each do |obj|
  metadata = obj.head[:metadata]
  content_type = "application/pdf"
  obj.copy_to(obj.key, :metadata => metadata, :content_type => content_type)
  obj.acl = :public_read
end
于 2013-04-19T09:19:07.300 に答える
1

Rubyではありませんが、拡張子とリセットに基づいてMIMEタイプを自動的に推測するこのプロジェクトは、他の回答が参照するのと同じコピー方法を使用していることを発見しました。ブロブをコピーする必要があるため、それほど高速ではありません。より速く実行する必要がある場合は、作業を分割して、IronWorker などを介して並行してコピーすることができます。私は権限をリセットするために同様のことをしました

于 2013-05-13T18:48:37.793 に答える