Ruby Net:: FTP Progress Bar

Кто-нибудь знает, как получить обновление статуса из библиотеки ruby ​​Net:: FTP при загрузке файла? Я пытаюсь реализовать веб-интерфейс, который показывает индикатор выполнения для процента, оставшегося при загрузке файла с удаленного ftp-сервера.

Ответ 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!