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


12

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

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

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

Answers:


25

这是一个如何使用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/

我了解命令的基本概念。但是由于这是一个替换指令,这会删除文件的版本吗?我的存储桶配置了版本控制,每个文件都有一些版本。替换它会删除所有版本并创建一个新文件,或者替换期间是否考虑到所有版本?
Joze

这是个好问题。绝对值得一掷千金。我的希望是仅替换元数据的请求不会
破坏

我进行了测试,结果发现版本仍然存在,但是元数据修改后的版本变为最新版本,旧版本具有以前的元数据。我正在尝试找到一种方法来递归地修改所有版本的元数据,而无需制作复杂的脚本来列出每个版本,然后修改其元数据……
Joze

此命令重置ACL。如果你需要非默认值,添加--acl=...
瓦西里·兹韦列夫

3

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

这是s3api 的文档

毋庸置疑,在递归地在整个存储桶上运行它之前,您应该先进行测试。


1
关于测试,请使用Amazon CLI中的“试运行”标志。
巴特

3

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

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

3

如前所述,您可以使用awsAmazon的工具,并使用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

这仅替换一个文件。如何对.apk类型的所有文件执行此命令?
巴特

@bart以递归方式查看我的答案。
t1m0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.