![](/img/trans.png)
[英]How to programmatically get the MD5 Checksum of Amazon S3 file using boto
[英]How to get the checksum of a key/file on amazon using boto?
我正在編寫兩個python腳本,它們將在Amazon S3中將文件從一個存儲桶移動到另一個存儲桶,然后驗證已移動的密鑰的內容。 在傾倒了他們的鍵類boto,並查看了這個 stackoverflow問題后,我發現了在復制文件后如何通過“etag”拉取校驗和。
但是,這只有在文件被下載/上傳時才有效,因為驗證將由完全不同的腳本完成,我需要幫助從文件中獲取etag而不實際下載它。
目前,工作流程為:文件1通過存儲桶並使用boto復制所有密鑰,然后打印輸出鍵的路徑,后跟其etag。 (buckets []是源和目標)這很好用:
inbuck = conn.get_bucket(buckets[0])
outbuck = conn.get_bucket(buckets[1])
for inkey in inbuck.list():
print buckets[1] + ";;" + inkey.key + ";;" + inkey.etag.replace("\"","")
out = Key(outbuck)
out.key = inkey.key
inkey.copy(outbuck,out.key,preserve_acl=True)
然后,文件2從文件1中讀取輸出,檢查密鑰是否存在,然后應該在目標中獲取密鑰的etag,以與輸入的內容進行比較。 但是,密鑰的etag始終為None,因為它未下載。
dstbuck = conn.get_bucket(destination[0])
dstkey = Key(dstbuck)
dstkey.key = destination[1]
if dstkey.exists() and dstkey.etag.replace("\"","") == destination[2]:
PASSED.append(dstkey.key)
else:
FAILED.append(dstkey.key)
程序崩潰,因為dstkey.etag為“None”。 有人知道解決這個問題嗎?
問題是你只是創建一個本地Key對象。 沒有從S3檢索有關密鑰的信息。 嘗試這樣的事情:
dstbuck = conn.get_bucket(destination[0])
dstkey = bucket.get_key(destination[1])
if dstkey is None:
FAILED.append(destination[1])
else:
# do etag check here
這樣,Key對象應該具有S3中關於對象的數據。 get_key
方法使用HTTP HEAD請求,因此不會檢索對象的主體,只檢索標頭。
此外,如果存儲桶名稱(即destination [0])對於給定的程序運行始終相同,則無需為存儲桶中的每個關鍵對象執行get_bucket
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.