Как рассчитать количество загружаемых данных и общее количество данных для загрузки в Ruby - PullRequest
0 голосов
/ 14 января 2010

Я пытаюсь создать настольный клиент, который управляет некоторыми загрузками с помощью Ruby. Я хотел бы знать, как поступить, пытаясь определить, сколько данных загружено и размер всех данных, которые должны быть загружены.

Я пытаюсь сделать это с Ruby, поэтому любая помощь будет полезна.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 января 2010

Как сказал Уэйн в своем комментарии, это зависит от протокола, который используется для передачи файлов. Например, для 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 голос
/ 14 января 2010

Если вы используете 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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...