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

Ruby SDK v3实现S3文件上传进度追踪的可行方案问询

用Ruby AWS SDK v3实现S3文件上传进度追踪

好消息!在AWS SDK for Ruby v3里,追踪S3文件上传进度已经变得直接又简便——官方提供了原生的progress_callback参数支持,不用再像旧版本那样手动封装IO流来统计传输字节了。

实现步骤&示例代码

首先,确保你已经安装了v3版本的SDK:

gem install aws-sdk-s3

1. 定义进度回调函数

先写一个用来处理进度更新的方法,它会在上传过程中被定期调用,接收两个参数:已传输字节数和总字节数:

def upload_progress(bytes_sent, total_bytes)
  progress_percent = (bytes_sent.to_f / total_bytes) * 100
  puts "上传进度: #{progress_percent.round(2)}% | #{bytes_sent}/#{total_bytes} 字节"
end

2. 用Resource模式实现上传(和你原来的代码风格一致)

如果你习惯用Aws::S3::Resource来操作,可以直接在upload_file方法里传入progress_callback参数:

require "aws-sdk-s3"

# 初始化S3资源(记得配置好你的AWS凭证,比如通过环境变量、~/.aws/credentials等)
s3_resource = Aws::S3::Resource.new(region: "your-region")
s3_bucket = s3_resource.bucket("your-bucket-name")

# 上传文件并追踪进度
file_path = "/本地文件路径/your-file.txt"
s3_object_key = "s3里的目标路径/file.txt"

s3_bucket.object(s3_object_key).upload_file(
  file_path,
  acl: "public-read",
  progress_callback: method(:upload_progress)
)

3. 用Client模式实现上传(v3推荐的更轻量方式)

如果你更倾向于直接使用客户端(Client)操作,也可以通过put_object方法传入回调:

require "aws-sdk-s3"

s3_client = Aws::S3::Client.new(region: "your-region")

file_path = "/本地文件路径/your-file.txt"
s3_object_key = "s3里的目标路径/file.txt"

File.open(file_path, "rb") do |file|
  s3_client.put_object(
    bucket: "your-bucket-name",
    key: s3_object_key,
    body: file,
    acl: "public-read",
    progress_callback: method(:upload_progress)
  )
end

补充说明

  • 这个回调函数会在上传的分块(如果用了分块上传)完成后被触发,频率取决于文件大小和网络状况,能实时反馈上传进度。
  • 对比旧版本的SDK(比如v2),v3的这个原生回调机制省去了手动包装IO流的麻烦,代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:36:42