You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

上传文件到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:06:05