Кто-нибудь знает, как получить обновление статуса из библиотеки ruby Net:: FTP при загрузке файла? Я пытаюсь реализовать веб-интерфейс, который показывает индикатор выполнения для процента, оставшегося при загрузке файла с удаленного ftp-сервера.
Ruby Net:: FTP Progress Bar
Ответ 1
Для справок в будущем - я наткнулся на решение:
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
Ответ 2
Я расширил ответы @smnirven и @theoretick, чтобы создать индикатор прогресса фиксированного размера, который заполняется по мере его завершения, чтобы вы могли визуально понять, насколько завершен прогресс:
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%[==============================>]
Ключом с этим примером является печать "\ r", чтобы переписать строку.
Ответ 3
Я построил на @smnirven отличный подход для немного менее шумного прогресса с прогрессией в 100 точек:
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
выход:
[progress] Downloading CBSA boundaries...
..........................................................................
..........................
[progress] Finished!