2017-04-12 96 views
1

我目前正試圖實現一個系統來驗證我上傳到S3的文件的完整性。通過適用於JavaScript的AWS開發工具包,我可以檢索遠程對象的ETag,但是,本地對象的MD5散列與ETag不匹配。我目前使用crypto生成,如下所示:在上傳到AWS S3時計算Node.js中的本地文件的ETag

var hash = crypto.createHash('md5'); 
stream = fs.createReadStream(localfile); 

stream.on('data', function (data) { 
    hash.update(data, 'utf8') 
}) 

stream.on('end', function() { 
    md5 = hash.digest('hex'); 

    < rest of the code > 
}); 

根據我的一切,同時尋找答案結果發現,對於S3對象的ETag應該是簡單的MD5哈希:例如the AWS documentation(重點煤礦):

爲了確保數據沒有受損穿越網絡,使用 內容-MD5報頭。當您使用此標頭時,Amazon S3會根據提供的MD5值檢查 對象,如果它們不匹配,則 會返回錯誤。 此外,您可以計算MD5,而 將對象放入Amazon S3,並將返回的ETag與 計算出的MD5值進行比較。

但是,我的本地散列與遠程ETag不匹配。我在這裏錯過了什麼嗎?

謝謝你的時間!

澄清:我只上傳小純文本文件,而我沒有處理多部分上傳。我已經看到,網絡上的很多問題都是關於多部分上傳的,但這僅僅適用於簡單的上傳。謝謝!

+1

取一個文件,使用'md5sum'命令行實用程序,並計算文件的md5sum。如果答案不同意你的計算,你的計算是不正確的。 「Content-MD5」標頭是您通過上傳發送的標頭。與十六進制編碼的ETag不同,Content-MD5是base64。 –

+1

你說你的測試文件是一個文本文件,我在你的代碼中看到'utf8'。你可以計算基於文件的*文本而不是二進制字節的MD5嗎? –

+0

其實,我很不好意思承認,在發佈之前的這段時間,我在代碼中做了一些改動,而且我不知不覺地上傳了與本地實際不同的文件,所以問題不在於MD5總和,但在椅子和桌子之間,一如既往。抱歉! – finferflu

回答

0

鍵盤和椅子之間存在問題。問題在於實際的文件上傳,而不是md5總和。