如何计算下载的数据量以及要在Ruby中下载的总数据

时间:2010-01-14 13:22:35

标签: ruby

我正在尝试构建一个桌面客户端,用Ruby管理一些下载。我想知道如何尝试确定下载了多少数据以及要下载的整个数据的大小。

我试图用Ruby做这个,所以任何帮助都会有用。

提前致谢。

2 个答案:

答案 0 :(得分:2)

就像韦恩在评论中所说,这取决于用于传输文件的协议。以HTTP为例,HTTP响应将包含一个Content-Length标头,它将告诉您正在下载的文件的长度。在您知道必须跟踪从HTTP连接中读取的字节数之后。

这样的东西似乎有效(对于HTTP),但如果可以更优雅地完成,我不会感到惊讶:

require 'net/http' 

url = URI.parse('http://www.google.com/index.html')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) do |http|
  http.request(req) do |res|
    remaining = res.content_length
    puts "total length: #{remaining}"
    res.read_body do |segment|
      puts "read #{segment.length} bytes"
      remaining = remaining - segment.length
      puts "#{remaining} bytes remaining"
    end
  end
end

www.google.com/index.html是一个糟糕的例子,因为内容在一个细分中返回,但是在较大的对象上尝试它,你应该看到多个“read ...”行。

答案 1 :(得分:1)

如果您正在使用Net :: HTTP,那么您请求的任何内容的长度应该在响应头中。 Net :: HTTP mixin NET :: HTTPHeader,在其中你会找到content_length()。虽然只有在转移发生之前确定尺寸才有效。

Net :: HTTPResponse有一个以块的形式读取正文的方法,因此您可以使用它来确定进度。从0开始并添加每个块的长度,将其与总大小进行比较,然后就完成了。

http.request_get('/index.html') {|res|
res.read_body do |segment|
  print segment
end
} #Example taken from Ruby-Documentation

如果您正在使用FTP,那么通过NET :: FTP应该更容易。连接到服务器,获取具有大小(文件名)的给定文件的大小,然后使用get,getbinaryfile或gettextfile下载该文件。

这是get方法的签名:get(remotefile,localfile = File.basename(remotefile),blocksize = DEFAULT_BLOCKSIZE){| data | ...}

ftp.get('file.something', 'file.something.local', 1024){ |data|
     puts "Downloaded 1024 more bytes"
}