使用AWS CLI上传到S3时如何设置Content-Type?

Ale*_*orm 15 amazon-s3 amazon-web-services aws-cli

我正在尝试设置S3静态网站托管,但它似乎在我的任何没有Content-TypeAWS控制台中设置的元数据字段的对象上返回403 .我无法弄清楚如何使用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"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是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": {}
}
Run Code Online (Sandbox Code Playgroud)

虽然它似乎设置了某种特殊ContentType属性,但Content-TypeAWS控制台中仍然没有元数据字段,也无法在浏览器中访问该文件.

我也试过类似的命令(aws s3 cp,aws s3 sync),没有运气.我将存储桶策略设置为可公开读取.

jam*_*sls 16

您的第二个示例--content-type是为对象设置内容类型的方法.显示的JSON响应是将Content-TypeHTTP响应中的标头映射到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": {}
}
Run Code Online (Sandbox Code Playgroud)

还使用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
Run Code Online (Sandbox Code Playgroud)


Bru*_*sky 6

这不是 OP 想要的,但 Google 派了很多人来这里。

如果您想设置已在 S3 上的对象的内容类型而无需--body再次上传,请参阅如何更改 Amazon S3 对象的内容类型


小智 5

在 AWS 控制台中,您可以键入所需的内容类型,即使下拉列表中未列出内容类型也是如此。