以纯 Ruby 脚本的形式上传到 S3

Upload to S3 with progress in plain Ruby script

这个问题与这个问题相关:Tracking Upload Progress of File to S3 Using Ruby aws-sdk,

但是,由于没有明确的解决方案,我想知道是否有 better/easier 方法(如果存在)在 2018 年使用 Ruby 通过 S3 获取文件上传进度?

在我当前的设置中,我基本上是在创建一个新的 Resource,获取我的存储桶并调用 upload_file,但我还没有找到任何传递块的选项,这将有助于产生一些有点进步。

...
@connection = Aws::S3::Resource.new
@s3_bucket = @connection.bucket(bucket)
@s3_bucket.object(path).upload_file(data, {acl: 'public-read'})
...

有没有办法使用最新的 sdk-for-ruby v3 来做到这一点?

任何帮助(或者最好是一个小例子)都会很棒。

Trevor 在 中给出的示例在我看来并不复杂 - 只是将事物连接在一起。 SDK 根本不提供用于传递所有操作的进度详细信息的功能。另外,Trevor 是 AWS Ruby SDK 的维护者,所以我相信他的判断。

扩展他的例子

bar = ProgressBar.create(:title => "Uploading action", :starting_at => 0, :total => file.size)
obj = s3.buckets['my-bucket'].objects['object-key']
obj.write(:content_length => file.size) do |writable, n_bytes|
  writable.write(file.read(n_bytes))
  bar.progress += n_bytes
end

如果您想在 upload_file 方法中设置进度块,我相信您需要打开 SDK 的 PR。 Ruby(或任何其他运行时)不是这种情况并不奇怪,因为例如,HTTP 客户端库中可能有一个优化,它使用来自源 [=] 的 IO.copy_stream 13=] 目标套接字的参数,它不会在任何地方中继进度。