所以我有一个python网络应用程序,它接收用户上传的图像并使用boto3将它们推送到S3进行存储,如下所示:
s3.Object(BUCKET_NAME, filename).put(Body=file_obj.read(), ContentType="image/*")
我的印象是你需要在上传时指定正确的内容类型(即image / jpeg,image / bmp等),否则S3将无法正确处理文件,但这似乎不是情况下。
我测试了内容类型为“image / *”且根本没有内容类型,一切似乎都运行良好 - 图片上传和存储很好,重新下载时它们没有损坏或任何东西。
到目前为止,我看到的唯一区别是,如果没有内容类型,您的Web浏览器将下载文件,而不是在新选项卡中显示图像(使用S3管理控制台时)
这个结论是否正确?内容类型只规定浏览器如何处理有问题的文件,或S3是否将其用于其他内容?
答案 0 :(得分:1)
你是对的。
S3不会将Content-Type
用于任何事情。
用户代理(浏览器) - 正如您所注意到的那样 - 该信息需要可用(并且正确)。
其他几个相似的内容,例如Content-Encoding
,Cache-Control
,Expires
和Content-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-acl
和x-amz-storage-class
。
还有一些其他标题打破了这种一般模式,可能值得单独提及:
X-Robots-Tag
似乎完全没有记录,但在上传时也会被接受,并且每个GET
都会返回到浏览器,因此这里的行为很像Content-Type
和朋友,如上所述。 S3不会根据它采取任何行动。此标头用于表示行为良好的爬虫,类似于/robots.txt
。常见值为X-Robots-Tag: noindex, nofollow
(不要将此页面编入索引,请勿关注此页面上的链接)。每次下载都会返回此标头,但只能通过API进行设置。它在控制台中可见,但无法使用控制台进行设置或编辑。这是一个隐形功能,据我所知完全无证。
Content-MD5
是随上传发送的可选(但强烈推荐)请求标头。它包含请求体的二进制md5,以base64编码。获取对象时,此标头不,但用于验证上载是否已损坏。如果请求正文与此哈希不匹配,则上传将被S3拒绝,并且永远不会保存。