Загрузка на S3 с прогрессом в простом Ruby-скрипте - PullRequest
0 голосов
/ 09 мая 2018

Этот вопрос относится к этому вопросу: Отслеживание хода загрузки файла в S3 с использованием Ruby aws-sdk ,

Однако, поскольку нет четкого решения этого вопроса, мне было интересно, есть ли лучший / более простой способ (если таковой существует) для получения прогресса загрузки файлов с помощью S3 с использованием Ruby в 2018 году?

В моей текущей настройке я в основном создаю новый 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?

Любая помощь (или даже лучше небольшой пример) была бы отличной.

1 Ответ

0 голосов
/ 12 мая 2018

Пример, который Тревор приводит в 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 в целевой сокет , который нигде не передает прогресс.

...