javascript - 如何通过签名 URL 在 S3 对象上定义 Cache-Control header ?

标签 javascript amazon-s3

按照 this guide 中的说明进行操作,我已经设法让上传通过签名的 URL 工作。它看起来像这样:

const s3 = new aws.S3();

const s3Params = {
  Bucket: S3_BUCKET,
  Key: fileName,
  Expires: 60,
  ContentType: fileType,
  ACL: 'public-read',
  CacheControl: 'public, max-age=31536000',
};

s3.getSignedUrl('putObject', s3Params, (err, data) => {
  // ...
});

...除了我的 CacheControl 参数(我自己添加;它不在指南中)似乎没有生效。当我使用上面的代码生成签名 URL 并向其上传内容时,S3 中生成的对象没有 Cache-Control header 。

我做错了什么?

最佳答案

您必须发送 Cache-Control上传请求中的 header ,无论您在签名 URL 生成期间设置了什么。

这是一个错误还是故意的行为是值得怀疑的,超出了我的回答能力。 Cache-Control正如您所注意到的, header 是签名 URL 的一部分,但无论出于何种原因,该信息在文件上传过程中都被完全忽略了,即。未指定 CacheControl getSignedUrl()中的属性(property)函数仍然允许客户端设置 Cache-Control header 到他们选择的任何值。

如果您需要控制 Cache-Control header ,然后使用 getSignedUrl()很可能不适合您的用例。

解决方案

AWS 现在支持一种新的签名方案,称为 AWS Signature version 4这允许完全控制上传请求可能包含或不包含的内容,包括发送哪些 header 以及发送哪些值。

JavaScript SDK 支持这个新的签名版本: createPresignedPost() .

有关如何生成此预签名 POST 的详细示例可以直接在 AWS's documentation 上找到政策和上传表单的外观。 .

尽管示例演示了通过标准 http 上传的文件上传 <form>元素,这些原则可以应用于任何能够执行 HTTP 通信的客户端/消费者。

例子

为了完整起见,这里有一个示例(取自上面链接的 AWS 文档页面)如何预签名 POST政策看起来像:

{ "expiration": "2015-12-30T12:00:00.000Z",
  "conditions": [
    {"bucket": "sigv4examplebucket"},
    ["starts-with", "$key", "user/user1/"],
    {"acl": "public-read"},
    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
    ["starts-with", "$Content-Type", "image/"],
    {"x-amz-meta-uuid": "14365123651274"},
    {"x-amz-server-side-encryption": "AES256"},
    ["starts-with", "$x-amz-meta-tag", ""],

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
    {"x-amz-date": "20151229T000000Z" }
  ]
}

此 POST 策略对请求设置了以下条件:

  • 上传必须在世界标准时间 2015 年 12 月 30 日午夜之前进行。
  • 内容只能上传到sigv4examplebucket .存储桶必须位于您在凭证范围(x-amz-credential 表单参数)中指定的区域中,因为您提供的签名仅在该范围内有效。
  • 您可以提供任何以 user/user1 开头的键名.例如,user/user1/MyPhoto.jpg .
  • ACL 必须设置为 public-read .
  • 如果上传成功,用户的浏览器将被重定向到 http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html .
  • 对象必须是图像文件。
  • x-amz-meta-uuid标记必须设置为 14365123651274 .
  • x-amz-meta-tag可以包含任何值。

请注意,此示例中的条件列表并不详尽并且 CacheControl 支持。查看creating a POST policy记录您可以用它做什么。

关于javascript - 如何通过签名 URL 在 S3 对象上定义 Cache-Control header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525423/

相关文章:

javascript - AngularJS 和 Bootstrap 工具提示的范围问题

javascript - 查看动态生成的代码

ruby - 预签名的 GET url 返回 403

node.js - 如何在AWS s3上存储图像缩略图

python - 使用 boto3 从 S3 存储桶中读取多个 csv 文件

javascript - 不再使用 jQuery 悬停时隐藏

javascript - React 样式组件子 prop 选择器

amazon-web-services - Angular 2和aws,找不到路线

heroku - Wicked_PDF 不渲染通过 Asset Sync 在生产中托管的 HTML 和 CSS Assets

javascript - 如何让 Colorbox 在页面加载后 5 秒显示?