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
相关产品推荐
相关产品推荐

