У меня есть большой контейнер S3 с вложенной структурой "папок", содержащей (помимо прочего) статические файлы .json и .md. Эти файлы обслуживаются S3 как, text/plain
а не как правильные 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 или другой API AWS, я подозреваю, что лучшим вариантом будет использование $ aws s3api copy-object
флага --content-type
для копирования объекта в него самого, устанавливая новый тип контента.
Вотдокументациядля s3api.
Само собой разумеется, что вам следует сначала протестировать это, прежде чем запускать рекурсивно на всем вашем контейнере.
решение4
Как упоминалось ранее, вы можете использовать aws
инструмент Amazon и использовать 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