递归更改 Amazon S3 上给定扩展名的文件的内容类型

递归更改 Amazon S3 上给定扩展名的文件的内容类型

text/plain我有一个大型 S3 存储桶,其中嵌套了“文件夹”结构,其中包含静态 .json 和 .md 文件(以及其他文件)。S3 以而不是正确的application/json和 的形式提供这些文件text/markdown

我已更新存储桶默认值,以便新上传的内容具有正确的内容类型。

遍历“树”并更新与特定扩展名匹配的文件的内容类型的最佳方法是什么?

答案1

以下是使用 aws cli 工具执行此操作的示例。cp 工具允许使用递归选项,我认为 s3api 工具无法做到这一点。在本例中,我正在修复一堆 SVG。当您准备好释放它时,请删除 --dryrun 选项。

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/

答案2

经过一番挖掘,我发现该s3cmd工具可以做到这一点。例如,要将 JSON 文件设置为 application/json:

s3cmd --recursive modify --acl-public \
       --add-header='content-type':'application/json' \
       --exclude '' --include '.json' \
       s3://bucket/

答案3

除非您想亲自使用 boto/python 或其他 AWS API,否则我认为最好的选择是使用$ aws s3api copy-object标志--content-type将对象复制到自身,并设置新的内容类型。

这是文档对于 s3api。

不用说,您应该先对此进行测试,然后再在整个存储桶上递归运行它。

答案4

如前所述,您可以使用aws亚马逊的工具并使用 s3api 将对象复制到其自身上,然后用它metadata-directive=REPLACE来更改内容类型。

我把它放在这里,因为有时您可能想要迭代存储在数据库中的文件名,这就是您可以通过 cli 执行此操作的方法。

aws s3api copy-object \
          --content-type="application/vnd.android.package-archive" \
          --metadata-directive="REPLACE" \
          --copy-source "MYBUCKET/FILE.apk" \
          --bucket "MYBUCKET" \
          --key "FILE.apk" \
          --acl public-read

相关内容