跟踪IO.copy_stream的进度

时间:2018-04-12 08:21:45

标签: ruby-on-rails ruby

我从网址下载文件:

url = "https://aws-file-url.com/bucket/large-file.mov"
path = Rails.root.join("tmp", SecureRandom.hex(12).to_s + Time.now.to_i.to_s)
IO.copy_stream(url, path)

使用IO.copy_stream下载文件需要时间,我希望能够跟踪已下载的金额并有总下载量,以便我可以获得一定百分比或等值的内容。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

您可以使用OpenURI::OpenRead。它的open()方法有两个lambda,即:content_length_proc和:progress_proc,它们提供了您所要的内容。

例如,如果您需要进度条:

require 'open-uri'
require 'progressbar' # you must install: gem install progressbar

pbar = nil
open(url,
   :content_length_proc => lambda { |t|
      if t && 0 < t
         pbar = ProgressBar.create(
            title: "Some download title for progress bar",
            total:t,
            progress_mark:'█'.encode('utf-8')
         )
      end
    },

    :progress_proc => lambda {|s|
       pbar.progress = s if pbar
    }
) { |f|
  IO.copy_stream(f, path)
}

请注意,此代码没有错误处理。

希望它能解决您的问题!