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

如何在启用版本控制的S3桶中区分同名对象与文件夹的版本ID

解决S3同名对象与文件夹版本区分问题

要分别获取对象test_001和文件夹test_001/下对象的版本ID,核心是利用S3 API的Prefix和Delimiter参数配合,或者精准过滤结果,以下是具体实现:

1. 获取单个对象test_001的所有版本

S3的list_object_versions接口没有直接的精确匹配参数,但可以通过Prefix+Delimiter组合排除子路径对象,再筛选目标Key:

import boto3

s3 = boto3.client('s3')
bucket_name = 'my-bucket'

# 获取前缀为test_001且排除子路径的结果
response = s3.list_object_versions(
    Bucket=bucket_name,
    Prefix='test_001',
    Delimiter='/'
)

# 从返回结果中筛选出Key完全等于test_001的版本
target_versions = [v for v in response.get('Versions', []) if v['Key'] == 'test_001']

for version in target_versions:
    print(f"对象test_001的版本ID: {version['VersionId']},最后修改时间: {version['LastModified']}")

这样返回的结果只会包含test_001对象本身的所有版本,不会混入test_001/下的子对象。

2. 获取文件夹test_001/下所有对象的版本

直接将Prefix设置为test_001/(结尾带斜杠),API会返回所有以该路径开头的对象版本,完全不会包含根路径下的test_001对象:

import boto3

s3 = boto3.client('s3')
bucket_name = 'my-bucket'

response = s3.list_object_versions(
    Bucket=bucket_name,
    Prefix='test_001/'
)

# 遍历所有子对象的版本
for version in response.get('Versions', []):
    print(f"对象{version['Key']}的版本ID: {version['VersionId']},最后修改时间: {version['LastModified']}")

# 如需处理删除标记(DeleteMarkers)可添加以下逻辑
for marker in response.get('DeleteMarkers', []):
    print(f"对象{marker['Key']}的删除标记版本ID: {marker['VersionId']}")

关键原理说明

  • S3中没有真正的"文件夹",所谓文件夹只是对象Key中带斜杠的前缀逻辑
  • 当Prefix设为test_001时,会匹配所有以test_001开头的Key(包括test_001和test_001/xxx)
  • 添加Delimiter='/'后,API会将test_001/这类前缀作为"公共前缀"分组,不会返回分组内的子对象,只返回前缀匹配的顶层对象
  • 用test_001/作为Prefix时,只会匹配Key以该路径开头的对象,自然排除根路径下的test_001

内容的提问来源于stack exchange,提问作者Dnyaneshwar Jadhav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:17:41