s3.getSignedUrl ResponseContentDisposition参数不起作用

时间:2016-07-12 21:32:36

标签: node.js amazon-web-services amazon-s3 http-headers

我成功生成了一个已签名的网址,然后我可以在有限的时间内从我的s3存储桶中下载资源。但是,我尝试在params中使用ResponseContentDisposition属性,如下所示:

  1. http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property
  2. http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
  3. 我不确定我是否做错了,但由于某种原因标头没有被设置。例如,如果我使用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示例,但它确实看起来像我正确设置内容处理。

    任何人都知道这里出了什么问题?

1 个答案:

答案 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日)

     

https://forums.aws.amazon.com/thread.jspa?threadID=235006