У меня есть большое ведро S3 с вложенной структурой «папок», содержащей (среди прочего) статические файлы .json и .md. Эти файлы обслуживаются S3 как text/plain
а не правильный application/json
и text/markdown
.
Я обновил настройки корзины по умолчанию, чтобы новые загрузки имели правильный тип содержимого.
Как лучше всего пройти по «дереву» и обновить тип содержимого для файлов, соответствующих определенному расширению?
Вот пример того, как это сделать с помощью инструмента 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/
Если вы не хотите запачкать руки с помощью boto / python или другого API AWS, я подозреваю, что лучше всего будет использовать $ aws s3api copy-object
с --content-type
флаг, чтобы скопировать объект в себя, задав новый тип содержимого.
Вот документация для s3api.
Само собой разумеется, что вы должны сначала протестировать это, прежде чем запускать его рекурсивно для всего вашего ведра.
Покопавшись, я обнаружил, что s3cmd
инструмент может это сделать. Например, чтобы установить файлы JSON в application / json:
s3cmd --recursive modify --acl-public \
--add-header='content-type':'application/json' \
--exclude '' --include '.json' \
s3://bucket/
Как упоминалось ранее, вы можете использовать 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