2

コンテンツの性質が設定されていない AWS S3 バケットに何百ものオブジェクトがあります。

Ruby aws-sdk gem を使用しています。

ファイルを再度アップロードせずに、これらのオブジェクトにコンテンツの性質を追加または変更するにはどうすればよいですか?

私が試してみました

obj.write(:content_disposition => 'attachment')
obj.copy_from(obj.key, :content_disposition => 'attachment')

また、copy_to()、move_to() もありますが、これらのいずれも、コンテンツの配置をオブジェクトに追加する際に機能しないようです。いくつかのケースでは、オブジェクトがまったく変更されていないように見えます (変更時間は変更されていません)。それ以外の場合は、オブジェクト ファイルが破損しています!


Content-Disposition ヘッダーを設定する HTTP 経由で :response_content_disposition を使用して s3 オブジェクトを要求する代替手段を認識しています。

obj.url_for(:read, :response_content_disposition => "attachment")

ありがとうございました!

4

2 に答える 2

1

aws-sdk ソースコードを変更することで解決策を見つけました。

s3/s3_object.rb内

次の行を copy_from() に追加します (:content_type の処理方法と同様)

if options[:content_disposition]
    copy_opts[:content_disposition] = options[:content_disposition]
    copy_opts[:metadata_directive] = "REPLACE"
end

また、s3/client.rb

下にマークされた行を追加します

object_method(:copy_object, :put,
                    :header_options => {
                    :copy_source => 'x-amz-copy-source',
                    :cache_control => 'Cache-Control',
                    :metadata_directive => 'x-amz-metadata-directive',
                    :storage_class => 'x-amz-storage-class',
                    :server_side_encryption => 'x-amz-server-side-encryption',
                    :content_type => 'Content-Type',
                    :content_disposition => 'Content-Disposition', # add this line here
                }) do

上記を実行したら、次の操作を実行して、コンテンツの配置を既存のオブジェクトに追加できます。

obj.copy_from(obj.key, :content_disposition => 'attachment', :content_type => 'image/png', :acl => :public_read)
于 2012-06-21T14:30:46.843 に答える