Как установить Content-Type при загрузке на S3 с помощью AWS CLI?

Я пытаюсь настроить статический хостинг веб-сайтов S3, но он возвращает 403 на любой из моих объектов, у которых нет поля метаданных Content-Type, установленного в консоли AWS. Я не могу понять, как это сделать с помощью инструмента AWS CLI.

С помощью параметра --metadata появляется сообщение:

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --metadata Content-Type=text/html
{
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\""
}
$ aws s3api head-object --bucket <bucket> --key foo.html
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Wed, 15 Apr 2015 06:39:48 GMT",
    "ContentLength": 189,
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"",
    "Metadata": {
        "content-type": "text/html"
    }
}

Но поле Content-Type объекта не отображается в разделе "Метаданные" консоли AWS, и я получаю 403 при попытке доступа к файлу в браузере.

Использование опции --content-type также не работает:

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --content-type text/html
{
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\""
}
$ aws s3api head-object --bucket <bucket> --key foo.html
{
    "AcceptRanges": "bytes",
    "ContentType": "text/html",
    "LastModified": "Wed, 15 Apr 2015 06:46:49 GMT",
    "ContentLength": 189,
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"",
    "Metadata": {}
}

В то время как кажется, что установлено какое-то специальное свойство ContentType, в консоли AWS по-прежнему нет поля метаданных Content-Type, а также я не могу получить доступ к файлу в браузере.

Я также пробовал подобные команды (aws s3 cp, aws s3 sync), не повезло. У меня политика ведра установлена ​​на общедоступную.

Ответ 1

Второй пример с --content-type - это способ задать тип контента для объекта. Выбранный ответ JSON отображает заголовок Content-Type в ответе HTTP на ключ ContentType, но соответствует фактическому заголовку Content-Type объекта. Я подтвердил, что значение типа содержимого отображается в разделе метаданных в консоли при использовании --content-type.

$ aws s3api put-object --bucket bucket --key foo.json --body foo.json --content-type application/json --acl public-read

$ aws s3api head-object --bucket jamesls-test-sync --key foo.json
{
    "AcceptRanges": "bytes",
    "ContentType": "application/json",
    "LastModified": "Wed, 15 Apr 2015 17:18:58 GMT",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "Metadata": {}
}

Также, используя curl, мы можем видеть, что заголовок типа контента установлен:

$ curl -I https://bucket.s3.amazonaws.com/foo.json
HTTP/1.1 200 OK
x-amz-id-2: ZlSg1aDUBu7z+9gWUg24uRn2TioI0hk2AGBBZ1iVbpUkv8RTrHWovzbHxL/y21Qe
x-amz-request-id: 8568C73EB95EE5A6
Date: Wed, 15 Apr 2015 17:20:42 GMT
Last-Modified: Wed, 15 Apr 2015 17:18:58 GMT
ETag: "d41d8cd98f00b204e9800998ecf8427e"
Accept-Ranges: bytes
Content-Type: application/json
Content-Length: 0
Server: AmazonS3

Ответ 2

В консоли AWS вы можете указать тип контента, который вы хотите, даже если тип содержимого не указан в раскрывающемся списке.

Ответ 3

Это не то, что ищет OP, но Google отправляет сюда много людей.

Если вы хотите установить тип содержимого объекта, который уже находится на S3, без необходимости снова загружать --body, см. --body Как изменить тип содержимого объектов Amazon S3.