有没有办法根据某些标签从Amazon S3下载对象?

时间:2015-02-23 21:51:35

标签: python amazon-s3 boto

我正在尝试从Amazon-S3下载对象(文件),但我面临的问题是跟踪哪些对象已被下载,因为每个存储桶中有大量对象,并且每天都会增加。

我一直在寻找一种方法,以便我可以set/unset一些与每个对象相关联的标签。因此,当我必须下载时,我可以查找所有未设置该特定标记的对象,下载它们然后设置它们的标记,以便下次再次下载它们。有办法吗?这样做的示例将很有帮助。

我正在使用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's copy()函数将文件从一个目录复制到同一个存储桶中的另一个目录。这是我目前的代码:

    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 个答案:

答案 0 :(得分:2)

您可以在上传对象时将任意元数据附加到S3对象,以便在最初上载文件时设置标记。但仍有两个问题需要克服:

  • 取消设置代码。 S3没有提供在创建对象之后修改对象元数据的方法。但是,它确实为您提供了一种将对象复制回自身(所有服务器端)并修改元数据的方法。所以,它是一个很大的笨重,但你可以在处理完对象后取消设置标签。
  • 查询代码。这是真正的问题。无法获取其元数据包含(或不包含)某个值的所有对象的列表。您必须不断列出存储桶中的所有对象以查找具有您标记的对象。而且,更糟糕的是,标签不会在桶列表中返回。您必须对每个对象执行HEAD请求以检索它的标记。

如果可以根据LastModifiedDate找到需要下载的所有对象,则可能会使用该对象。您仍然需要列出所有对象,但最后修改日期将在清单列表数据中返回,因此不需要HEAD请求。

或者,您可以使用prefix对对象进行排序。您可以使用new/mynewobject之类的名称将所有新对象上传到存储桶,然后获取包含prefix=new的所有对象的列表。下载对象后,您可以使用COPY操作来"移动"新文件夹中的对象,因此您不会再次处理它。

或者你可以使用像DynamoDB这样的数据库来帮助你跟踪事情。