Получить размер файла перед загрузкой и подсчитать, сколько уже загружено (http + ruby) - PullRequest
11 голосов
/ 20 февраля 2010

Может кто-нибудь помочь мне

  • получить размер файла до Я начинаю загрузку
  • показывает, сколько % уже загружено

.

require 'net/http'
require 'uri'

url = "http://www.onalllevels.com/2009-12-02TheYangShow_Squidoo_Part 1.flv"

url_base = url.split('/')[2]
url_path = '/'+url.split('/')[3..-1].join('/')

Net::HTTP.start(url_base) do |http|
  resp = http.get(URI.escape(url_path))
  open("test.file", "wb") do |file|
    file.write(resp.body)
  end
end
puts "Done."

Ответы [ 4 ]

21 голосов
/ 20 февраля 2010

Используйте метод request_head. Как это

response = http.request_head('http://www.example.com/remote-file.ext')
file_size = response['content-length']

Размер файла будет в байтах.

Для получения дополнительной информации перейдите по этим двум ссылкам.

http://ruby -doc.org / STDLIB / libdoc / сеть / HTTP / RDoc / классы / Net / HTTP.html # M000695

http://curl.haxx.se/mail/archive-2002-07/0070.html

4 голосов
/ 20 февраля 2010

так что я заставил его работать даже с индикатором выполнения ...

require 'net/http'
require 'uri'
require 'progressbar'

url = "url with some file"


url_base = url.split('/')[2]
url_path = '/'+url.split('/')[3..-1].join('/')
@counter = 0

Net::HTTP.start(url_base) do |http|
  response = http.request_head(URI.escape(url_path))
  ProgressBar#format_arguments=[:title, :percentage, :bar, :stat_for_file_transfer]
  pbar = ProgressBar.new("file name:", response['content-length'].to_i)
  File.open("test.file", 'w') {|f|
    http.get(URI.escape(url_path)) do |str|
      f.write str
  @counter += str.length 
  pbar.set(@counter)
    end
   }
end
pbar.finish
puts "Done."
3 голосов
/ 20 февраля 2010

Размер файла доступен в заголовке ответа HTTP Content-Length. Если его нет, вы ничего не можете сделать. Чтобы рассчитать%, просто сделайте начальную школу по математике следующим образом (часть / общая сумма * 100)

0 голосов
/ 09 сентября 2016

Здесь полный код для получения подробной информации о файле перед загрузкой

require 'net/http'
response = nil
uri = URI('http://hero.com/abc.mp4')
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.head(uri)
end
response.header.each_header {|key,value| puts "#{key} = #{value}" } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...