【问题标题】:s3.getSignedUrl ResponseContentDisposition parameter not workings3.getSignedUrl ResponseContentDisposition 参数不起作用
【发布时间】:2016-11-15 07:21:51
【问题描述】:

我成功地生成了一个签名的 url,然后我可以在有限的时间内使用它从我的 s3 存储桶中下载资源。但是,我正在尝试使用此处记录的参数中的 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

我不确定我是否做错了,但由于某种原因没有设置标题。例如,如果我使用从 s3.getSignedUrl 返回的 url:

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"

标题是:

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

我正在设置这个,像这样使用 javascript s3 sdk:

function tempRedirect(req, res) {
    var filename = req.params[0];
    var contentDisposition = 'attachment; filename=data.jpg';
    var params = {
        Bucket: S3_BUCKET,
        ResponseContentDisposition: contentDisposition,
        Key: checkTrailingSlash(getFileKeyDir(req)) + filename
    };
    var s3 = new aws.S3(s3Options);
    s3.getSignedUrl('getObject', params, function(err, url) {
        res.redirect(url);
    });
};

文档很简单,我只能找到 PHP 示例,但看起来我正确设置了内容配置。

有人知道这里出了什么问题吗??

【问题讨论】:

  • 您不需要使用 ResponseContentDisposition。最初将文件放入 S3 存储桶时,请确保向 putObject 方法传递内容类型参数(例如,类似于 contentType: 'image/jpeg')。然后,当您通过预签名 URL 下载它们时,该对象已经包含必要的元数据以将其作为 JPG 附件进行处理;这意味着当您尝试通过预签名 URL 下载对象时,它会自动打开一个文件选择器,询问您要将适当类型的附件保存在哪里。

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


【解决方案1】:

根据RFC- 2616,您的值格式不正确。

预期格式为attachment; filename="funny-cat.jpg"。文件名是一个带引号的字符串。

而且,我最初的假设是 S3 将其视为无效而拒绝,并默默地拒绝替换该值。

随后的测试揭示了意外行为:如果 Content-Disposition 未与对象一起存储,则 &response-content-disposition=... 按预期工作,设置响应标头。但是,如果对象中存储了标头,则此查询字符串参数不具有“覆盖”该值的记录效果。

相反,&response-content-type=...确实覆盖了对象的存储Content-Type:

这就是一些快速测试为我揭示的结果。

但这似乎是 S3 中的一个错误——或者更准确地说,是某种回归。根据一篇支持论坛帖子,这种行为实际上是不一致的,有时有效,有时无效。

S3 已意识到此问题,我们正在努力解决它。 (2016-07-12)

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

【讨论】:

  • 我试过引用和不引用。仍然 S3 始终使用原始 Content-disposition 并忽略我的 ReponseContentDisposition 参数。我只是以某种方式称它完全错误吗?或者我可能误解了这个参数应该如何改变实际下载中的标题?
  • 真的,我应该能够将 contentDisposition 设置为“foo bar bar”,尽管这是完全错误的,但我希望 S3 只是将该值反映给我。如果他们正在对我的设置进行一些验证并因为它格式错误而忽略它,getObject 和 getSignedUrl 不会以任何方式让我知道这一点,并且可能会彻底失败。
  • 同意,无声的失败是出乎意料的,但这是我想到的唯一可能性,因为你正在尝试的事情应该完全符合你的意图。它允许您在下载时设置响应标头,覆盖与对象一起存储的标头。
  • 啊。找到了。请参阅更新的答案。另外,你是对的,它没有经过验证。
  • 迈克尔,谢谢!看来我们只能等了!
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2020-10-02
  • 2021-08-03
  • 1970-01-01
  • 2018-03-17
  • 2021-08-09
  • 2016-09-03
  • 2017-02-23
相关资源
最近更新 更多