【问题标题】:Ruby - Save file parts before download finishesRuby - 在下载完成之前保存文件部分
【发布时间】:2015-01-30 10:15:52
【问题描述】:

我正在研究用 Ruby 下载脚本,但大多数最终都是这样的:

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

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

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

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

谢谢...

【问题讨论】:

    标签: ruby download download-manager


    【解决方案1】:

    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= 调用以设置“同步模式”。

    【讨论】:

    • 谢谢!顺便说一句,“io.sync”在你的代码中做了什么?
    • 来自链接文档:“当同步模式为真时,所有输出都会立即刷新到底层操作系统,并且不会在内部缓冲。”。换句话说:您的文件会随着下载的进行而增长。
    猜你喜欢
    • 2016-06-20
    • 2016-02-25
    • 2018-12-02
    • 2021-09-06
    • 2010-09-28
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多