2010-02-20 9 views
9

¿Puede alguien ayudarme aObtener el tamaño del archivo antes de descargar y contando la cantidad ya se han descargado (http + rubí)

  • obtener el tamaño archivo antes de que empezar a descargar
  • pantalla
  • cuánto % ya estaba descargado

.

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." 

Respuesta

4

así que hice que funcione incluso con la barra de progreso ....

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

El tamaño del archivo está disponible en el encabezado de respuesta HTTP Content-Length. Si no está presente, no puedes hacer nada. Para calcular el%, simplemente haga las matemáticas de la escuela primaria como (parte/total * 100).

17

Utilice el método request_head. Como este

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

El tamaño del archivo será en bytes.

Siga estos dos enlaces para obtener más información.

http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html#M000695

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

+0

@GeekTantra: la respuesta ['content-length'] funciona bien. Gracias. Estaba intentando mostrar ' respuesta 'y no me dio nada. La gran pregunta ahora es cómo puedo contar lo que ya se descargó ... – Radek

+0

Eso no es posible. Es responsabilidad del servidor establecer el encabezado 'Content-Length'. Si 'http: // www.onalllevels.com' está bajo su control, arréglelo; de lo contrario, intente ponerse en contacto con ellos y solicite que lo solucionen. – BalusC

+0

Me dijeron que el servidor 'no tiene que proporcionar' el' content-length' http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html usa la palabra SHOULD send ... – Radek

0

Aquí el código completo para obtener detalles de los archivos antes de descargar

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}" } 
Cuestiones relacionadas