2015-04-15 3 views
7

Ich versuche, S3 statische Website-Hosting einzurichten, aber es scheint 403 auf einem meiner Objekte, die nicht über das Content-Type Metadaten-Feld in der AWS-Konsole festgelegt haben. Ich kann nicht herausfinden, wie man das mit dem AWS CLI-Tool macht.Wie lege ich beim Hochladen auf S3 mit AWS CLI Content-Type fest?

Mit der --metadata Option scheint zu funktionieren:

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

Aber das Content-Type Feld in den „Metadaten“ die AWS-Konsole nicht sichtbar auf dem Objekt, und ich bekomme ein 403, wenn sie Zugang versuchen die Datei in einem Browser.

Mit der --content-type Option funktioniert auch nicht:

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

Während es irgendeine Art von spezieller ContentType Eigenschaft zu setzen scheint, gibt es noch keine Content-Type Metadatenfeld in der AWS-Konsole, noch kann ich Greife auf die Datei in einem Browser zu.

Ich habe auch ähnliche Befehle (aws s3 cp, aws s3 sync) versucht, ohne Glück. Ich habe die Bucket-Richtlinie auf öffentlich lesbar eingestellt.

Antwort

11

Ihr zweites Beispiel mit --content-type ist die Möglichkeit, Inhaltstyp für ein Objekt festzulegen. Die angezeigte JSON-Antwort ordnet den Header Content-Type in der HTTP-Antwort dem Schlüssel ContentType zu, entspricht jedoch dem tatsächlichen Header Content-Type des Objekts. Ich habe bestätigt, dass der Wert des Inhaltstyps im Metadatenabschnitt der Konsole angezeigt wird, wenn --content-type verwendet wird.

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

auch curl verwenden, können wir die Inhaltstyp-Header sehen gesetzt:

$ 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 
+0

Dies funktioniert nicht, wenn ich den '--acl public-read' Parameter weglassen. Gibt es eine Möglichkeit, dies zum Laufen zu bringen, während der Zugriff auf einen bestimmten IP-Bereich gesperrt wird, wie ich es in meiner Bucket-Richtlinie getan habe? –

+0

Es macht nichts, scheint dieses Setup bereits genau das, was ich will: obwohl die Objekt-ACL auf 'public-read' gesetzt ist, gilt die Bucket-Richtlinie immer noch. –

0

In der AWS-Konsole können Sie in der Content-Typ eingeben, die Sie selbst wenn der Content-Type wollen ist nicht in der Dropdownliste aufgeführt.

Verwandte Themen