2016-01-28 35 views
2

如果我在s3上有文件,我該如何更改該文件的元數據?在s3文件上更改標題

它看起來像我可以「複製」到相同的位置與新的標題,這實際上是相同的事情。

我使用knox作爲節點客戶端來執行此操作。有問題的文件已將Content-Type標頭設置爲video/mp4,但我想將其更改爲application/octet-stream。原因是這個鏈接會觸發瀏覽器下載資源,而不是在瀏覽器窗口中顯示它。

鏈接knox source此功能

var filename = "/example/file.mp4", 
    headers = {'Content-Type': "application/octet-stream"}; 

client.copyFile(filename, filename, headers, function(error, resp) { 
    //response is successful 
}); 

的反應是成功的,但是當我在S3重新加載資源我看不到頭已經改變。

我可以看到底層的API調用是這樣的:

'PUT /example/file.mp4 HTTP/1.1\r\nContent-Type: application/octet-stream 
x-amz-copy-source: /bucket/example/file.mp4 
Content-Length: 0\r\nDate: Thu, 28 Jan 2016 21:13:12 GMT 
Host: cc-video-archives-dev.s3.amazonaws.com 
Authorization: <redacted>=\r\nConnection: close\r\n\r\n', 
+1

API調用看起來正確...複製對象本身確實是如何修改元數據的......但是你沒有'Cache-Control'頭文件,所以你可能會看到一個緩存的響應。或者您可能會在S3中看到一致性問題 - 新創建的對象將立即可用;即使通常幾乎立即(儘管並非總是),覆蓋和刪除也不能保證。檢查S3控制檯中的對象元數據? –

+0

啊,有趣。所以我登錄到S3控制檯來檢查元數據,它沒有改變,仍然是'video/mp4' – dylanjha

+1

其實,我的錯誤:API調用*不是很正確。它缺少'x-amz-metadata-directive:REPLACE'。如果未指定,則默認爲「COPY」。請注意,通過'REPLACE',*所有*元數據將僅替換爲您提供的元數據,因此如果您想保留其他元數據,則必須將其提取並將其包含在放置/複製請求中。 http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html –

回答

0

我錯過了這個頭:

var filename = "/example/file.mp4", 
    headers = { 
    "x-amz-metadata-directive": "REPLACE", 
    'Content-Type': "application/octet-stream" 
    }; 

client.copyFile(filename, filename, headers, function(error, resp) { 
    //response is successful 
});