Пример, который Тревор приводит в https://stackoverflow.com/a/12147709/153886, не является хакерским из того, что я вижу, - просто соединяю вещи вместе. SDK просто не предоставляет функцию для передачи сведений о ходе выполнения всех операций. Кроме того, Тревор является сопровождающим Ruby SDK в AWS, поэтому я доверяю его мнению.
Расширяя свой пример
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
, я полагаю, вам нужно открыть PR для SDK. Это не так странно, что это не так для Ruby (или для любой другой среды выполнения), потому что, например, может быть оптимизация в клиентской библиотеке HTTP, которая использует IO.copy_stream
из исходного аргумента body
в целевой сокет , который нигде не передает прогресс.