如何使用aws cli更改对象的内容类型?

时间:2014-05-08 17:08:04

标签: amazon-s3 command-line-interface content-type aws-cli

我在Amazon S3中存储了多个对象,其内容类型I需要从text/html更改为application/rss+xml。我认为应该可以使用复制命令执行此操作,为源和目标指定相同的路径。我尝试使用AWS cli工具执行此操作,但我收到此错误:

$ aws s3 cp s3://mybucket/feed/ogg/index.html \
            s3://mybucket/feed/ogg/index.html \
            --content-type 'application/rss+xml'
copy failed: s3://mybucket/feed/ogg/index.html
to s3://mybucket/feed/ogg/index.html
A client error (InvalidRequest) occurred when calling the
CopyObject operation: This copy request is illegal because it is
trying to copy an object to itself without changing the object's
metadata, storage class, website redirect location or encryption
attributes.

如果我为来源和目的地指定了不同的路径,我就不会收到错误:

$ aws s3 cp s3://mybucket/feed/ogg/index.html \
            s3://mybucket/feed/ogg/index2.html \
            --content-type 'application/rss+xml'
copy: s3://mybucket/feed/ogg/index.html
to s3://mybucket/feed/ogg/index2.html

即使命令成功完成,也会使用index2.html内容类型创建text/html对象,而不是我指定的application/rss+xml类型。

如何修改此命令行以使其正常工作?

3 个答案:

答案 0 :(得分:10)

可以使用低级s3api进行此更改:

$ aws s3api copy-object --bucket archive --content-type "application/rss+xml" \
    --copy-source archive/test/test.html --key test/test.html \
    --metadata-directive "REPLACE"

http://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html

问题是无法指定--metadata-directive。谢谢你指出open issue / feature request,nelstrom!

答案 1 :(得分:1)

您可以使用 aws s3 cp 命令覆盖文件的 content-type,使用 --metadata-directive 可选属性指定将内容类型替换为在复制过程中随 --content-type 'application/rss+xml' 一起提供:

aws s3 cp \
--content-type 'application/rss+xml' \
--metadata-directive REPLACE \
s3://mybucket/feed/ogg/index.html \
s3://mybucket/feed/ogg/index.html

更多信息:https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

然后,您可以通过检查文件元数据来验证:

aws s3api head-object \
--bucket mybucket \
--key feed/ogg/index.html

答案 2 :(得分:0)

您还可以使用更高级别的API来实现此目的,方法是在其自身上复制文件,但将其标记为元数据中的更改:

aws s3 cp \
  --content-type "application/rss+xml" \
  --metadata-directive REPLACE \
  s3://mybucket/myfile \
  s3://mybucket/myfile