如何让ListObjectsV2正确校验S3对象的文件类型与扩展名?
解决方案
方案1:改用head_object接口(推荐)
head_object是S3专门用于检查指定对象是否存在的接口,仅匹配完全相等的Key,不会触发前缀匹配逻辑,无需额外做后缀校验即可解决你的误判问题。
import boto3 from botocore.exceptions import ClientError s3 = boto3.client("s3") bucket = "bucketName" key = "folder1/folder2/myObject.csv" try: s3.head_object(Bucket=bucket, Key=key) print("s3 object exists") except ClientError as e: if e.response['Error']['Code'] == '404': print("s3 object does not exist") else: # 非不存在的其他错误(如权限不足)可按需自行处理 raise
该方案下你提到的2、3场景传入不完整的Key会直接返回404,完全符合需求,同时接口请求开销比list_objects_v2更低。
方案2:保留list_objects_v2的适配方案
如果你的业务场景必须使用list_objects_v2,可以在返回结果中加一层精确匹配校验即可:
import boto3 s3 = boto3.client("s3") bucket = "bucketName" key = "folder1/folder2/myObject.csv" res = s3.list_objects_v2(Bucket=bucket, Prefix=key) exist = False if res.get("KeyCount") > 0: for obj in res.get("Contents", []): if obj["Key"] == key: exist = True break print("s3 object exists" if exist else "s3 object does not exist")
内容的提问来源于stack exchange,提问作者game pirate
相关产品推荐
相关产品推荐

