2

我们在 AWS S3 存储桶中有数百个没有设置内容处置的对象。

我正在使用 Ruby aws-sdk gem。

如何在不重新上传文件的情况下向这些对象添加或更改内容配置?

我努力了

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

还有copy_to(),move_to(),但这些似乎都不能将内容配置添加到对象中。在少数情况下,对象似乎根本没有被修改(修改时间没有改变),在其他情况下,对象文件已损坏!


我知道在通过 HTTP 请求 s3 对象时使用 :response_content_disposition 的替代方法,它设置 Content-Disposition 标头,

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 回答
0

对于后代,这是一个基于 cli 的解决方案。if 首先列出其中的对象,/mybucket/brand_img/ios/然后将每个项目的内容配置设置为文件名。我需要这个,因为我的文件名中有“@”,我不想强​​制客户端对路径进行 url 编码。

aws s3 ls s3://mybucket/brand_img/ios/|awk {'print $4'} > objects.txt

while read line; do aws s3api copy-object --bucket mybucket  \
--copy-source /mybucket/brand_img/ios/$line --key brand_img/ios/$line \
--metadata-directive REPLACE --metadata Content-Disposition=$line --acl public-read; done < objects.txt
于 2018-03-15T18:03:56.260 回答