Amazon s3 如何在AmazonS3中添加或修改现有对象的内容配置?

Amazon s3 如何在AmazonS3中添加或修改现有对象的内容配置?,amazon-s3,amazon-web-services,Amazon S3,Amazon Web Services,我们在AWS S3存储桶中有数百个对象,它们没有设置内容配置 我正在使用Ruby aws sdk gem 如何在不重新上载文件的情况下向这些对象添加或更改内容配置 我试过了 obj.write(:content_disposition => 'attachment') obj.copy_from(obj.key, :content_disposition => 'attachment') 还可以将_复制到()、将_移动到(),但在将内容配置添加到对象中时,这些操作似乎都不起作用。在

我们在AWS S3存储桶中有数百个对象,它们没有设置内容配置

我正在使用Ruby aws sdk gem

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

我试过了

obj.write(:content_disposition => 'attachment')
obj.copy_from(obj.key, :content_disposition => 'attachment')
还可以将_复制到()、将_移动到(),但在将内容配置添加到对象中时,这些操作似乎都不起作用。在少数情况下,对象似乎根本没有被修改(修改时间没有改变),在其他情况下,对象文件已损坏


我知道可以选择使用:响应\内容\处置 当通过HTTP请求s3对象时,设置内容处置头

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

谢谢大家!

我们通过更改aws sdk源代码找到了解决方案

在s3/s3_object.rb中

将以下行添加到copy_from()(类似于:content_type的处理方式)

另外,在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)

对于未来几代人,这里有一个基于cli的解决方案。如果首先列出
/mybucket/brand\u 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
aws s3 ls s3://mybucket/brand_img/ios/|awk{'print$4'}>objects.txt
读行时;aws s3api是否复制对象--bucket mybucket\
--复制源/mybucket/brand_img/ios/$line——关键品牌_img/ios/$line\
--元数据指令REPLACE--metadata Content Disposition=$line--acl public read;done
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