Получить размер файла перед загрузкой и подсчет, сколько уже загружено (http+ruby)
Может ли кто-нибудь помочь мне
- получить размер файла Перед я начинаю загрузку
- показать, сколько % уже загружено
.
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 ответов:
Используйте метод request_head. Вот так
response = http.request_head('http://www.example.com/remote-file.ext') file_size = response['content-length']Размер файла будет в байтах.
Для получения дополнительной информации перейдите по этим двум ссылкам.
Http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html#M000695
Поэтому я заставил его работать даже с индикатором прогресса ....
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."
Размер файла доступен в HTTP
Content-Lengthзаголовок ответа. Если его нет, вы ничего не можете сделать. Чтобы вычислить%, просто сделайте математику начальной школы, как (часть / всего * 100).
Здесь полный код для получения сведений о файле перед загрузкой
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}" }
Comments