Amazon S3使用内容类型标头的含义是什么?

时间:2016-03-30 06:41:42

标签: python amazon-s3

所以我有一个python网络应用程序,它接收用户上传的图像并使用boto3将它们推送到S3进行存储,如下所示:

s3.Object(BUCKET_NAME, filename).put(Body=file_obj.read(), ContentType="image/*")

我的印象是你需要在上传时指定正确的内容类型(即image / jpeg,image / bmp等),否则S3将无法正确处理文件,但这似乎不是情况下。

我测试了内容类型为“image / *”且根本没有内容类型,一切似乎都运行良好 - 图片上传和存储很好,重新下载时它们没有损坏或任何东西。

到目前为止,我看到的唯一区别是,如果没有内容类型,您的Web浏览器将下载文件,而不是在新选项卡中显示图像(使用S3管理控制台时)

这个结论是否正确?内容类型只规定浏览器如何处理有问题的文件,或S3是否将其用于其他内容?

1 个答案:

答案 0 :(得分:1)

你是对的。

S3不会将Content-Type用于任何事情。

用户代理(浏览器) - 正如您所注意到的那样 - 该信息需要可用(并且正确)。

其他几个相似的内容,例如Content-EncodingCache-ControlExpiresContent-Disposition - S3只会在获取对象时返回这些响应,为了浏览器的好处。这些不会改变S3的行为。

还有interesting capability for GET requests使用预先签名的网址,您可以要求S3覆盖存储的值并在响应中返回不同的内容。无论您在S3中存储了什么,查询字符串中带有response-content-type=application/octet-stream签名 URL都会触发S3为该单个响应返回Content-Type: application/octet-stream

只有x-amz-*标题,排除匹配x-amz-meta-*的标题实际上会导致S3的行为变化,例如x-amz-aclx-amz-storage-class

还有一些其他标题打破了这种一般模式,可能值得单独提及:

X-Robots-Tag似乎完全没有记录,但在上传时也会被接受,并且每个GET都会返回到浏览器,因此这里的行为很像Content-Type和朋友,如上所述。 S3不会根据它采取任何行动。此标头用于表示行为良好的爬虫,类似于/robots.txt。常见值为X-Robots-Tag: noindex, nofollow(不要将此页面编入索引,请勿关注此页面上的链接)。每次下载都会返回此标头,但只能通过API进行设置。它在控制台中可见,但无法使用控制台进行设置或编辑。这是一个隐形功能,据我所知完全无证。

Content-MD5是随上传发送的可选(但强烈推荐)请求标头。它包含请求体的二进制md5,以base64编码。获取对象时,此标头,但用于验证上载是否已损坏。如果请求正文与此哈希不匹配,则上传将被S3拒绝,并且永远不会保存。