boto3 s3 get_object
函数
文档(从AWS服务定义文件自动生成)将IfMatch
参数描述为
仅当其实体标签(ETag)与指定的对象相同时才返回该对象,否则返回412(前提条件失败)。
但是,当我尝试使用IfMatch
参数时,无法使S3响应非200 HTTP状态代码或引发异常。
此示例代码
import boto3
import hashlib
import json
BUCKET = 'your-bucket-name-goes-here'
data = {'foo': 'bar', 'baz': 'buz'}
payload = json.dumps(data, sort_keys=True, indent=4).encode('UTF-8')
etag = hashlib.md5(payload).hexdigest()
print("Locally computed etag : {}".format(etag))
client = boto3.client('s3')
response = client.put_object(
Body=payload,
Bucket=BUCKET,
ContentType='application/json',
Key='/test.json')
etag_with_quotes = response['ETag']
print("Etag returned from put_object: {}".format(etag_with_quotes))
response = client.get_object(
Bucket=BUCKET,
Key='/test.json',
IfMatch=etag
)
print("Etag returned from get_object: {}".format(response['ETag']))
print("HTTP status code : {}".format(response['ResponseMetadata']['HTTPStatusCode']))
response = client.get_object(
Bucket=BUCKET,
Key='/test.json',
IfMatch=etag_with_quotes
)
print("Etag returned from get_object: {}".format(response['ETag']))
print("HTTP status code : {}".format(response['ResponseMetadata']['HTTPStatusCode']))
产生这个输出
Locally computed etag : d14e36174d57c305bd9d7c171e669ac8
Etag returned from put_object: "d14e36174d57c305bd9d7c171e669ac8"
Etag returned from get_object: "d14e36174d57c305bd9d7c171e669ac8"
HTTP status code : 200
Etag returned from get_object: "d14e36174d57c305bd9d7c171e669ac8"
HTTP status code : 200
如果本地副本相同,应该如何使用
IfMatch
参数来避免下载文件? 最佳答案
如果ETag匹配,IfMatch
下载对象。要仅下载不同的内容,请使用IfNoneMatch
。
另请注意,这仅适用于未使用分段上传上传的对象。 Multpart上载使用different ETag algorithm,其中包含各个部分的二进制(不是十六进制)md5哈希值的十六进制md5哈希,然后是-
,然后是部分数目。您可以自己成功计算出这些,但是更加复杂。
关于python - AWS boto3 get_object调用的IfMatch参数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57228127/