2017-04-20 31 views
6

按照this guide中的说明,我已经设法通过签名的URL来使上载工作。它看起来是这样的:如何通过签名的URL在S3对象上定义Cache-Control标头?

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标头。

我在做什么错?

回答

7

无论您在签名的URL生成过程中设置了什么,您都必须在上传请求中发送Cache-Control标头。

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

如果您需要控制Cache-Control标题,那么使用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政策规定下列条件在请求:

  • UTC午夜之前必须发生在12月30日上传,到2015年
  • 该内容只能上传到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文档,了解您可以用这个做什么。

相关问题