我成功生成了一个已签名的网址,然后我可以在有限的时间内从我的s3存储桶中下载资源。但是,我尝试在params中使用ResponseContentDisposition属性,如下所示:
我不确定我是否做错了,但由于某种原因标头没有被设置。例如,如果我使用url,我会从s3.getSignedUrl:
返回 links.foldLeft(Map.empty[String, Int])
((map: Map[String, Int], next : String) => map + (next, map.get(next).getOrElse(0) + 1))
标题是:
curl -i "https://foo-dev.s3.amazonaws.com/images/foo.jpg?AWSAccessKeyId=AKIAICBHUC26S6B446PQ&Expires=1468359314&Signature=EeBqx1G83oeusarBl2KUbbCCBgA%3D&response-content-disposition=attachment%3B%20filename%3Ddata.jpg"
我设置此项,使用javascript s3 sdk,如下所示:
x-amz-id-2: SG9rjYQCcuqgKfjBmMbDQC2CNLcnqBAFzP7zINa99VYUwNijPOm5Ea/5fllZ6cnt/Qti7e26hbE=
x-amz-request-id: 2670068008525B1D
Date: Tue, 12 Jul 2016 21:26:16 GMT
Content-Disposition: inline; filename=foo.jpg
Last-Modified: Tue, 12 Jul 2016 00:47:23 GMT
ETag: "2a8e36651b24769170f4faa429f40f54"
Accept-Ranges: bytes
Content-Type: image/jpeg
Content-Length: 43373
Server: AmazonS3
文档非常简单,我只能找到PHP示例,但它确实看起来像我正确设置内容处理。
任何人都知道这里出了什么问题?
答案 0 :(得分:5)
根据RFC- 2616,您的价值观不正确。
预期格式为attachment; filename="funny-cat.jpg"
。文件名是带引号的字符串。
而且,我最初的假设是S3拒绝将其视为无效并且默默地拒绝替换该值。
后续测试显示意外行为:如果Content-Disposition
未与对象一起存储,则&response-content-disposition=...
按预期工作,设置响应标头。但是如果存在与对象一起存储的标头,则此查询字符串参数没有记录的"覆盖"那个价值。
相反,&response-content-type=...
会覆盖对象的存储Content-Type:
。
这是为我揭示的一些快速测试。
但这似乎是一个错误 - 或者更确切地说,某种回归 - 在S3中。根据一个支持论坛帖子,行为实际上是不一致的,有时是有效的,有时不是。
S3了解此问题,我们正在努力解决此问题。 (2016年7月12日)