Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 使用boto3客户端检索s3对象的Etag_Amazon S3_Checksum - Fatal编程技术网

Amazon s3 使用boto3客户端检索s3对象的Etag

Amazon s3 使用boto3客户端检索s3对象的Etag,amazon-s3,checksum,Amazon S3,Checksum,在一个场景中,我需要验证存储在s3存储桶中的文件的校验和(md5)。这可以在上载文件时通过在api调用的元数据中指定校验和值来实现。但在我的例子中,我想在以编程方式将数据放入bucket之后验证校验和。S3中的每个对象都将具有名为“ETag”的属性,该属性是S3计算的md5校验和 是否仍然可以使用python脚本中的boto3客户端获取特定对象的ETag并比较存储在s3中的本地文件和文件的校验和?boto3 api提供了一种获取存储在s3中的对象元数据的方法。以下代码段将有助于通过编程方式获取元

在一个场景中,我需要验证存储在s3存储桶中的文件的校验和(md5)。这可以在上载文件时通过在api调用的元数据中指定校验和值来实现。但在我的例子中,我想在以编程方式将数据放入bucket之后验证校验和。S3中的每个对象都将具有名为“ETag”的属性,该属性是S3计算的md5校验和


是否仍然可以使用python脚本中的boto3客户端获取特定对象的ETag并比较存储在s3中的本地文件和文件的校验和?

boto3 api提供了一种获取存储在s3中的对象元数据的方法。以下代码段将有助于通过编程方式获取元数据:

>>> s3_cli = boto3.client('s3')
>>> s3_resp = s3_cli.head_object(Bucket='ventests3', Key='config/ctl.json')
>>> print pprint.pprint(s3_resp)
>>> pp.pprint(s3_resp)
{u'AcceptRanges': 'bytes',
 u'ContentLength': 4325,
 u'ContentType': 'binary/octet-stream',
 u'ETag': '"040c003386f1e2001816d32f2125d07a"',
 u'LastModified': datetime.datetime(2018, 9, 20, 7, 15, 3, tzinfo=tzutc()),
 u'Metadata': {},
 'ResponseMetadata': {'HTTPHeaders': {'accept-ranges': 'bytes',
                                      'content-length': '4325',
                                      'content-type': 'binary/octet-stream',
                                      'date': 'Thu, 20 Sep 2018 07:20:53 GMT',
                                      'etag': '"040c003386f1e2001816d32f2125d07a"',
                                      'last-modified': 'Thu, 20 Sep 2018 07:15:03 GMT',
                                      'server': 'AmazonS3',
                                      'x-amz-id-2': 'P2wapOciWCKPfol2sBgoo11tRdr4KwKcDJ/nHW7LZn00mvKfMYyfAPPV2tIcf3Vu+lrV57NBARY=',
                                      'x-amz-request-id': '42AF970E7C9AA18C'},
                      'HTTPStatusCode': 200,
                      'HostId': 'P2wapOciWCKPfol2sBgoo11tRdr4KwKcDJ/nHW7LZn00mvKfMYyfAPPV2tIcf3Vu+lrV57NBARY=',
                      'RequestId': '42AF970E7C9AA18C',
                      'RetryAttempts': 0}}

>>> s3obj_etag = s3_resp['ETag'].strip('"')
>>> print s3obj_etag
'040c003386f1e2001816d32f2125d07a'

s3客户端对象中的head\u object()方法将获取存储在s3 bucket中的给定对象的元数据(头)。

不要使用bucket中对象的ETag来确定另一个bucket中对象的对象等价性(使用相同的键)。在一些实验中,我发现对于大型对象,ETag在区域之间并不一致。例如,us-east-1中存储桶中的大文件在复制到us-east-2时可能具有不同的ETag。桶与桶之间ETag值的一致性因对象而异。我看到一些大型对象在这两个区域具有相同的ETag。我使用md5sum创建了自己的标记,当我将一个对象从一个bucket复制到另一个bucket时,我也会复制标记。

实际上,上面的代码会生成错误,就像缺少参数一样

这对我有用

s3.meta.client.head_bucket(Bucket='mybucket')

谢谢@Peter Van Sickel。我可以用它来确定同一个bucket中的对象等价性吗?这不完全是bucket到bucket的问题,相反,如果对象是使用多部分上传(=线程上传大文件)创建的,则ETag计算为每个部分MD5的MD5。因此,您必须知道进入多部分上载或从块大小(ugh)重新驱动的块