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/

10-11 06:53