web-dev-qa-db-fra.com

Comment définir le type de contenu lors du téléchargement vers S3 avec AWS CLI?

J'essaie de configurer l'hébergement de site Web statique S3, mais il semble renvoyer 403 sur tous mes objets qui n'ont pas le champ de métadonnées Content-Type Défini dans la console AWS. Je ne peux pas comprendre comment le faire avec l'outil AWS CLI.

L'utilisation de l'option --metadata Semble fonctionner:

$ 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"
    }
}

Mais le champ Content-Type Sur l'objet n'est pas visible dans la section "Métadonnées" de la console AWS, et j'obtiens un 403 lorsque j'essaie d'accéder au fichier dans un navigateur.

L'utilisation de l'option --content-type Ne fonctionne pas non plus:

$ 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": {}
}

Bien qu'il semble définir une sorte de propriété spéciale ContentType, il n'y a toujours pas de champ de métadonnées Content-Type Dans la console AWS, et je ne peux pas accéder au fichier dans un navigateur.

J'ai également essayé des commandes similaires (aws s3 cp, aws s3 sync), Sans succès. J'ai la stratégie de compartiment définie sur lisible publiquement.

13
Alek Storm

Votre deuxième exemple avec --content-type Est la façon de définir le type de contenu d'un objet. La réponse JSON affichée mappe l'en-tête Content-Type Dans la réponse HTTP à la clé ContentType, mais elle correspond à l'en-tête Content-Type Réel de l'objet. J'ai confirmé que la valeur du type de contenu apparaît dans la section des métadonnées de la console lorsque j'utilise --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": {}
}

En utilisant également curl, nous pouvons voir que l'en-tête du type de contenu est défini:

$ 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
16
jamesls

Dans la console AWS, vous pouvez saisir le type de contenu souhaité, même si le type de contenu n'est pas répertorié dans la liste déroulante.

4
chris

Ce n'est pas ce que le PO recherchait, mais Google envoie beaucoup de gens ici.

Si vous souhaitez définir le type de contenu d'un objet qui est déjà sur S3 sans avoir à télécharger le --body encore une fois, voir Comment changer le type de contenu des objets Amazon S

2
Bruno Bronosky