2015-02-23 75 views
1

我試圖從Amazon-S3下載對象(文件),但我面臨的問題是跟蹤哪些對象已下載,因爲每個存儲桶中都有大量對象,並且每天都會增加對象。有沒有辦法根據某些標籤從Amazon S3下載對象?

我一直在尋找一種方法,以便我可以將一些標籤與每個對象關聯起來。因此,當我必須下載時,我可以查找所有沒有設置特定標籤的對象,下載它們,然後設置它們的標籤,以便下次再次下載它們。有沒有辦法做到這一點?這樣做的示例將有所幫助。我使用boto來通過python下載對象。目前的代碼基本上是下載我必須命名的單個對象。

from boto.s3.connection import S3Connection 

conn = S3Connection(S3 Credentials) 
bucket = conn.get_bucket (Bucket Name) 
key = bucket.get_key(Object Name) 
key.get_contents_to_filename(Local Object Path to Download) 

更新的代碼: 我試圖將文件從一個目錄使用boto'scopy()功能同一個桶中複製到另一個目錄。這是我當前的代碼:

conn = S3Connection(S3 Credentials) 
    bucket = conn.get_bucket (Bucket Name) 
    key = bucket.get_key(Object Name) 
    key2= bucket.get_key(/new/dir/in_same_bucket/) 
    key.get_contents_to_filename(Local Object Path to Download) 
    key.copy(bucket.name, key2.name,metadata=None, preserve_acl=True) 

當我這樣做時,我得到錯誤爲AttributeError: 'NoneType' object has no attribute 'name'。如何使用copy()將文件從一個目錄複製到同一個桶中的另一個目錄?

回答

1

當您上傳對象時,您可以將任意元數據附加到S3對象,以便在文件初始上傳時設置標籤。但是還有兩個問題需要克服:

  • 取消設置標籤。在創建對象之後,S3不提供修改對象元數據的方法。但是,它確實爲您提供了一種將對象複製到自身(所有服務器端)並修改元數據的方法。所以,它很笨重,但是你可以在處理對象之後取消設置標籤。
  • 查詢標籤。這是真正的問題。無法獲取元數據包含(或不包含)特定值的所有對象的列表。您必須不斷列出存儲桶中的所有對象才能找到具有標籤的對象。而且,更糟糕的是,標籤不會被返回到存儲列表中。您必須對每個對象執行HEAD請求以檢索其標籤。

如果需要下載的所有對象都可以基於它們的LastModifiedDate找到,那麼您可能會使用它。您仍然必須列出所有對象,但最後修改日期將返回到存儲桶列表數據中,因此不需要HEAD請求。

或者,您可以使用prefix排序您的對象。您可以使用new/mynewobject這樣的名稱將所有新對象上傳到存儲桶,然後獲取所有具有prefix=new的對象的列表。下載對象後,可以使用COPY操作將對象移出新文件夾,以便不再處理它。

或者您可以使用類似DynamoDB的數據庫來幫助您跟蹤事物。

+0

感謝您的回答。你可以通過一個例子來詳細說明'LastModifiedDate'方法嗎?還有,我們可以在對象下載後重命名對象,我們可以在對象名稱中添加某種前綴以使其顯示爲下載? – 2015-02-24 15:41:01

+0

我對上面的代碼做了一些修改。我試圖將文件從一個目錄複製(移動)到另一個目錄中的另一個目錄中,但遇到了我在上面的帖子中提到的錯誤 – 2015-02-24 17:49:31

相關問題