無論您在簽名的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文檔,瞭解您可以用這個做什麼。