Quelqu'un connaît-il un moyen d'obtenir une mise à jour du statut de la bibliothèque Net::FTP de Ruby pendant le téléchargement d'un fichier ? J'essaie d'implémenter une interface web qui affiche une barre de progression pour le pourcentage restant lors du téléchargement d'un fichier à partir d'un serveur ftp distant.
Réponses
Trop de publicités?Pour une référence future - je suis tombé sur une solution :
filesize = ftp.size(filename)
transferred = 0
p "Beginning download, file size: #{filesize}"
ftp.getbinaryfile(filename, "#{SOURCE_IMPORT_DIRECTORY}/#{filename}", 1024) { |data|
transferred += data.size
percent_finished = ((transferred).to_f/filesize.to_f)*100
p "#{percent_finished.round}% complete"
}
ftp.close
J'ai développé les réponses données par @smnirven et @theoretick pour créer une barre de progression de taille fixe qui se remplit au fur et à mesure qu'elle se termine afin que vous puissiez avoir une idée visuelle de l'avancement de la progression :
def getprogress(ftp,file,local_path)
transferred = 0
filesize = ftp.size(file)
ftp.get(file, local_path, 1024) do |data|
transferred += data.size
percent = ((transferred.to_f/filesize.to_f)*100).to_i
finished = ((transferred.to_f/filesize.to_f)*30).to_i
not_finished = 30 - finished
print "\r"
print "#{"%3i" % percent}%"
print "["
finished.downto(1) { |n| print "=" }
print ">"
not_finished.downto(1) { |n| print " " }
print "]"
end
print "\n"
end
ouput :
Executing gather for: ruby
Going to public ftp - ftp.ruby-lang.org
File list for /pub/ruby/2.0/:
ruby-2.0.0-p647.tar.gz
Downloading: ruby-2.0.0-p647.tar.gz
100%[==============================>]
La clé dans cet exemple est l'impression " \r " afin de réécrire la ligne.
Je me suis appuyé sur l'excellente approche de @smnirven pour une progression un peu moins bruyante avec une progression à 100 points :
filesize = ftp.size(filename)
transferred = 0
notified = false
ftp.getbinaryfile(filename, full_local_path, 1024) do |data|
transferred += data.size
percent_finished = (((transferred).to_f/filesize.to_f)*100)
if percent_finished.to_s.include?('.0')
print "." if notified == false
notified = true
else
notified = false
end
end
ftp.close
sortie :
[progress] Downloading CBSA boundaries...
..........................................................................
..........................
[progress] Finished!
Juste une petite mise à jour du code pour rendre la sortie un peu plus propre.
filesize = ftp.size(FILENAME)
transferred = 0
percent_finished = -9999
ftp.gettextfile(FILENAME, File.basename(FILENAME)) { |data|
transferred += data.size
temp = (((transferred).to_f/filesize.to_f)*100).round
if percent_finished < temp
percent_finished = temp
STDOUT.write "\r Download progress: #{percent_finished.round}% completed"
end
}
ftp.close