I'm trying to set up S3 static website hosting, but it appears to return 403 on any of my objects that don't have the Content-Type
metadata field set in the AWS console. I cannot figure out how to do this with the AWS CLI tool.
Using the --metadata
option appears to work:
$ 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" } }
But the Content-Type
field on the object isn't visible in the "Metadata" section of the AWS console, and I get a 403 when trying to access the file in a browser.
Using the --content-type
option also doesn't work:
$ 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": {} }
While it appears to set some sort of special ContentType
property, there still isn't a Content-Type
metadata field in the AWS console, nor can I access the file in a browser.
I've also tried similar commands (aws s3 cp
, aws s3 sync
), with no luck. I have the bucket policy set to publicly-readable.
cp --recursive is the command used to copy files recursively to an s3 bucket. You can also use Sync command with the default recursive keyword.
When you upload content to AWS S3, the object can be assigned a MIME type that describes the format of the contents. The transfer service automatically applies content types to objects as they are uploaded, with content types assigned from the following list: 3dm. x-world/x-3dmf.
Your second example with --content-type
is the way to set content type for an object. The JSON response displayed is mapping the Content-Type
header in the HTTP response to the ContentType
key, but it corresponds to the actual Content-Type
header of the object. I confirmed that the content type value does show up in the metadata section in the console when using --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": {} }
Also using curl, we can see the content type header is set:
$ 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With