如何使用 AWS CLI 更改对象的内容类型?

Posted

技术标签:

【中文标题】如何使用 AWS CLI 更改对象的内容类型?【英文标题】:How can I change the content-type of an object using AWS CLI? 【发布时间】:2014-06-26 05:28:33 【问题描述】:

我有几个对象存储在 Amazon S3 中,我需要将其内容类型从 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 类型。

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

【问题讨论】:

刚刚看到this issue 报告了同样的问题。该线程包括几个解决方法,所以我会看看我如何处理它们。 【参考方案1】:

您可以使用aws s3 cp 命令覆盖文件的content-type,使用--metadata-directive 可选属性指定内容类型被替换为@987654324 提供的内容类型@复制期间:

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】:

您也可以使用更高级别的 API 来执行此操作,方法是将文件复制到自身之上,但将其标记为元数据中的更改:

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

【讨论】:

【参考方案3】:

可以使用低级别的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!

【讨论】:

如何对具有特定扩展名的多个对象执行此操作? 可能有一种更简洁的方法,但是您可以在文件中列出对象,然后读取所有行并在每一行上执行上述命令,所以上面看起来像:while read line; do copy-object --bucket archive --content-type "application/rss+xml" --copy-source archive/$line.html --key $line.html --metadata-directive "REPLACE"; done < objects.txt跨度>

以上是关于如何使用 AWS CLI 更改对象的内容类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改aws cli中的默认配置文件变量?

AWS IAM-如何禁止用户通过控制台进行更改,但允许通过CLI更改API

text 通过CLI获取AWS S3存储桶的内容

如何临时切换 AWS CLI 的配置文件?

如何通过在 AWS CLI 中使用其 ARN 来获取 lambda 函数?

使用aws cli将S3对象上传到存储桶后如何获取它?