2010-02-20 3 views
9

Quelqu'un peut-il me aider àObtenez la taille du fichier avant de télécharger et compter combien déjà téléchargé (http + Ruby)

  • obtenir la taille du fichier avant je commence à télécharger
  • affichage combien % était déjà téléchargé

.

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

Répondre

4

donc je l'ai fait travailler même avec la barre de progression ....

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

La taille du fichier est disponible dans l'en-tête de réponse HTTP Content-Length. Si ce n'est pas le cas, vous ne pouvez rien faire. Pour calculer le%, faites juste les maths de l'école primaire comme (partie/total * 100).

17

Utilisez la méthode request_head. Comme ceci

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

La taille de fichier sera en octets.

Suivez ces deux liens pour plus d'informations.

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: réponse ['contenu-longueur'] fonctionne bien.Merci.J'essayais d'afficher ' réponse »et cela ne m'a rien donné. La grande question est maintenant comment je peux compter ce qui a déjà été téléchargé .... – Radek

+0

Ce n'est pas possible. C'est la responsabilité du serveur de définir l'en-tête 'Content-Length'. Si 'http: // www.onalllevels.com' est sous votre contrôle, corrigez-le, sinon essayez de le contacter et demandez-lui de le réparer. – BalusC

+0

On m'a dit que le serveur 'n'a pas à fournir' la longueur de contenu http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html utiliser le mot DEVRAIT envoyer ... – Radek

0

Voici le code complet pour obtenir les détails du fichier avant de les télécharger

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}" } 
Questions connexes