如何使用boto在amazon上获取密钥/文件的校验和?

2024-09-30 03:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写两个python脚本,在amazons3中将文件从一个bucket移到另一个bucket,然后验证已经移动的键的内容。在仔细研究了boto的Key类之后,并查看了thisstackoverflow问题,我发现了如何在文件被复制后通过“etag”提取校验和。在

但是,这只在文件被下载/上传的情况下有效,因为验证将由完全不同的脚本完成,我需要帮助从文件中获取etag,而不需要实际下载它。在

目前,工作流程是: 文件一通过一个bucket并使用boto复制所有密钥,然后打印路径 输出键后面跟着它们的etag。(bucket[]是源和目标)这很好:

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,因为它没有被下载。在

^{pr2}$

在这里程序崩溃了dstkey.etag是“无”。 有人知道怎么解决这个问题吗?在


Tags: 文件key脚本内容bucket密钥outconn
1条回答
网友
1楼 · 发布于 2024-09-30 03:23:31

问题是您只是在创建一个本地键对象。没有从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的关于该对象的数据。{cd1>不会检索到对象的头,因此不会只使用请求的头。在

另外,如果bucket名称(即destination[0])对于给定的程序运行总是相同的,则不需要对bucket中的每个key对象执行get_bucket。在

相关问题 更多 >

    热门问题