如何使用boto3上传S3文件时同时获取版本ID及进度回调?
解决S3上传同时获取进度回调和Version ID的问题
你可以通过以下两种简单方法实现需求,无需用标记查找对象版本:
方法一:upload_file + 上传后调用head_object
先用带回调的upload_file完成上传,再通过head_object获取刚上传对象的Version ID:
import boto3 def my_callback(bytes_transferred): print(f"已上传 {bytes_transferred} 字节") client = boto3.client('s3') bucket_name = '你的存储桶名称' object_key = '对象键' file_path = '本地文件路径' # 带进度回调上传文件 client.upload_file(file_path, bucket_name, object_key, Callback=my_callback) # 获取上传对象的Version ID response = client.head_object(Bucket=bucket_name, Key=object_key) version_id = response['VersionId'] print(f"Version ID: {version_id}")
这种方式逻辑简单,上传完成后直接读取对象元数据即可拿到Version ID,适合绝大多数场景。
方法二:put_object + 自定义文件包装器
通过包装文件对象,在put_object上传过程中触发进度回调,同时直接从响应中获取Version ID:
import boto3 class ProgressFileWrapper: def __init__(self, file_obj, callback): self.file_obj = file_obj self.callback = callback self.bytes_transferred = 0 def read(self, chunk_size): data = self.file_obj.read(chunk_size) self.bytes_transferred += len(data) self.callback(self.bytes_transferred) return data def my_callback(bytes_transferred): print(f"已上传 {bytes_transferred} 字节") client = boto3.client('s3') bucket_name = '你的存储桶名称' object_key = '对象键' file_path = '本地文件路径' with open(file_path, 'rb') as f: wrapped_file = ProgressFileWrapper(f, my_callback) # 上传并直接获取Version ID response = client.put_object(Bucket=bucket_name, Key=object_key, Body=wrapped_file) version_id = response['VersionId'] print(f"Version ID: {version_id}")
这种方式无需额外调用API,通过自定义文件读取逻辑实现进度回调,适合需要更精细控制上传流程的场景。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

