上传文件到S3存储桶后校验存在再删除本地文件的实现方案
S3上传后校验存在并删除本地文件的实现方案
你可以通过Boto3的head_object接口查询已上传对象的元数据来做存在性校验,确认上传成功后再执行本地文件删除操作,完整实现逻辑如下:
import boto3 import os from botocore.exceptions import ClientError s3_client = boto3.client('s3') def upload_and_cleanup(file_name, bucket, object_name=None): # 如果没有指定object_name,默认用本地文件名 if object_name is None: object_name = os.path.basename(file_name) # 执行上传 try: response = s3_client.upload_file(file_name, bucket, object_name) except ClientError as e: print(f"上传失败:{e}") return False # 校验S3端是否存在对应对象,可选附加校验文件大小 try: response = s3_client.head_object(Bucket=bucket, Key=object_name) # 附加校验:比对S3对象大小和本地文件大小是否一致 local_file_size = os.path.getsize(file_name) s3_file_size = response['ContentLength'] if s3_file_size != local_file_size: print("校验失败:S3端文件大小和本地文件不一致") return False except ClientError as e: if e.response['Error']['Code'] == '404': print("校验失败:S3端不存在对应对象") else: print(f"校验出错:{e}") return False # 校验通过,删除本地文件 try: os.remove(file_name) print(f"本地文件{file_name}已删除") return True except OSError as e: print(f"删除本地文件失败:{e}") return False
注意事项
upload_file方法本身默认已开启ETag校验,会自动对比本地文件MD5和S3返回的ETag,校验不通过会自动抛出异常- 如果你上传的是超过8MB的分块上传文件,S3返回的ETag不是普通的MD5值,此时不要直接比对ETag,用文件大小校验更稳妥
- 调用
head_object需要当前账号有S3桶的s3:GetObject权限,否则会返回403错误
内容的提问来源于stack exchange,提问作者Juliette
相关产品推荐
相关产品推荐

