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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:24:56