Ruby - 在下载完成前保存文件部分

Ruby - Save file parts before download finishes

我正在寻找 Ruby 中的下载脚本,其中大部分最终都是这样的:

File.open(fileName, 'wb') do |output|
  open(@url) do |data|
    output.write(data.read)
  end
end

这种方法似乎打开一个流并完全下载文件,最后将数据保存到文件中... 有没有办法让代码定期将已下载的数据保存到文件中?

例如,在一个 100MB 的 Youtube 视频中,我希望脚本将它下载的每 1MB 保存到文件中,并继续执行此操作直到下载完成...

这样您就可以在下载完成前用合适的播放器打开文件并播放。

谢谢...

OpenURI 似乎在将文件传递给块之前读取整个文件,但您可以使用 Net::HTTPstream the response body:

require 'net/http'

uri = URI(@url)

Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new uri

  http.request request do |response|
    open file_name, 'w' do |io|
      io.sync = true
      response.read_body do |chunk|
        io.write chunk
      end
    end
  end
end

注意 IO#sync= 设置“同步模式”的调用。