使用 AWS CLI 上传到 S3 时如何设置内容类型?
How do I set Content-Type when uploading to S3 with AWS CLI?
我正在尝试设置 S3 静态网站托管,但在我的任何未在 AWS 控制台中设置 Content-Type
元数据字段的对象上似乎 return 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"
}
}
但是对象的 Content-Type
字段在 AWS 控制台的 "Metadata" 部分不可见,当我尝试在浏览器中访问文件时收到 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
),但没有成功。我将存储桶策略设置为公开可读。
您使用 --content-type
的第二个示例是为 object 设置内容类型的方法。显示的 JSON 响应将 HTTP 响应中的 Content-Type
header 映射到 ContentType
键,但它对应于实际的 Content-Type
header的 object。我确认在使用 --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,我们可以看到设置了内容类型 header:
$ 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
在 AWS 控制台中,即使内容类型未在下拉列表中列出,您也可以键入所需的内容类型。
这不是 OP 想要的,但是 Google 派了很多人来这里。
如果您想要设置 S3 上已有对象的内容类型而无需再次上传 --body
,请参阅 How to change content type of Amazon S3 Objects
我正在尝试设置 S3 静态网站托管,但在我的任何未在 AWS 控制台中设置 Content-Type
元数据字段的对象上似乎 return 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"
}
}
但是对象的 Content-Type
字段在 AWS 控制台的 "Metadata" 部分不可见,当我尝试在浏览器中访问文件时收到 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
),但没有成功。我将存储桶策略设置为公开可读。
您使用 --content-type
的第二个示例是为 object 设置内容类型的方法。显示的 JSON 响应将 HTTP 响应中的 Content-Type
header 映射到 ContentType
键,但它对应于实际的 Content-Type
header的 object。我确认在使用 --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,我们可以看到设置了内容类型 header:
$ 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
在 AWS 控制台中,即使内容类型未在下拉列表中列出,您也可以键入所需的内容类型。
这不是 OP 想要的,但是 Google 派了很多人来这里。
如果您想要设置 S3 上已有对象的内容类型而无需再次上传 --body
,请参阅 How to change content type of Amazon S3 Objects