我正在尝试从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()
将文件从一个目录复制到同一个存储桶中的另一个目录?
答案 0 :(得分:2)
您可以在上传对象时将任意元数据附加到S3对象,以便在最初上载文件时设置标记。但仍有两个问题需要克服:
HEAD
请求以检索它的标记。如果可以根据LastModifiedDate
找到需要下载的所有对象,则可能会使用该对象。您仍然需要列出所有对象,但最后修改日期将在清单列表数据中返回,因此不需要HEAD
请求。
或者,您可以使用prefix
对对象进行排序。您可以使用new/mynewobject
之类的名称将所有新对象上传到存储桶,然后获取包含prefix=new
的所有对象的列表。下载对象后,您可以使用COPY操作来"移动"新文件夹中的对象,因此您不会再次处理它。
或者你可以使用像DynamoDB这样的数据库来帮助你跟踪事情。