Если вы используете 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"
}