2017-04-20 28 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文檔,瞭解您可以用這個做什麼。

相關問題