该问题通常由于在上传文件时,未正确设置Content-MD5头部信息,导致上传的Etag与实际文件的Etag不匹配。可以通过以下代码示例来正确设置Content-MD5头部信息:
import boto3
from botocore.exceptions import ClientError
import hashlib
import base64
def get_md5(file_path):
"""计算文件的MD5值"""
md5 = hashlib.md5()
with open(file_path,'rb')as f:
while True:
data = f.read(4096)
if not data:
break
md5.update(data)
return base64.b64encode(md5.digest()).decode()
# 客户端
s3 = boto3.client('s3')
# 桶名称和文件路径
bucket_name = 'my_bucket'
file_path = 'my_file.txt'
# 上传至S3
with open(file_path, 'rb') as data:
content = data.read()
md5 = get_md5(file_path)
try:
response = s3.put_object(
ACL='private',
Body=content,
Bucket=bucket_name,
Key=file_path,
ContentMD5=md5
)
print("上传成功!")
except ClientError as e:
print(e)
在上述示例中,我们通过计算文件的MD5值,并将结果以base64编码的形式作为Content-MD5头部信息进行传输,从而确保上传的文件的Etag与实际文件的Etag一致。