2014-06-13 22 views
5

a 8.9MB file'u indirmek için aşağıdaki Ruby snippet'ini kullanıyorum.Zlib :: BuefError kullanırken progressbar/ruby-progressbar gem

require 'open-uri' 
require 'net/http' 
require 'uri' 

def http_download_no_progress_bar(uri, filename) 
    uri.open(read_timeout: 500) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

ben indirme işlemini görselleştirmek için progressbar taş eklemek istiyorum:

/home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:357:in `finish': 
buffer error (Zlib::BufError)oooooo | 8.0MB 8.6MB/s ETA: 0:00:00 

    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:357:in `finish' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:262:in `ensure in inflater' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:262:in `inflater' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:274:in `read_body_0' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:201:in `read_body' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:328:in `block (2 levels) in open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1415:in `block (2 levels) in transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http/response.rb:162:in `reading_body' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1414:in `block in transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1405:in `catch' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1405:in `transport_request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:1378:in `request' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:319:in `block in open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/net/http.rb:853:in `start' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:313:in `open_http' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:724:in `buffer_open' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:210:in `block in open_loop' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:208:in `catch' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:208:in `open_loop' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri' 
    from /home/user/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/open-uri.rb:704:in `open' 

arada ben de ruby-progressbar çalıştı: Ancak

require 'open-uri' 
require 'progressbar' 
require 'net/http' 
require 'uri' 

def http_download_with_progressbar(uri, filename) 
    progressbar = nil 
    uri.open(
    read_timeout: 500, 
    content_length_proc: lambda { |total| 
    if total && 0 < total.to_i 
     progressbar = ProgressBar.new("...", total) 
     progressbar.file_transfer_mode 
    end 
    }, 
    progress_proc: lambda { |step| 
     progressbar.set step if progressbar 
    } 
) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

, şimdi aşağıdaki hata nedeniyle başarısız gem:

require 'open-uri' 
require 'ruby-progressbar' 
require 'net/http' 
require 'uri' 

def http_download_with_ruby_progressbar(uri, filename) 
    progressbar = nil 
    uri.open(
    read_timeout: 500, 
    content_length_proc: lambda { |total| 
     if total && 0 < total.to_i 
     progressbar = ProgressBar.create(title: filename, total: total) 
     end 
     }, 
     progress_proc: lambda { |step| 
     progressbar.progress = step if progressbar 
     } 
) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

ile aynı hatayla başarısız. İşte sorun için associated issue.

+0

TIL ['open-uri'] (http://ruby-doc.org/stdlib/libdoc/open-uri/rdoc/OpenURI/OpenRead.html#method-i-open) bazı temiz seçeneklere sahiptir (ve üzgünüm, senin probleminle yardım edemiyorum)… – DMKE

cevap

4

Sorun, her yöntem this file: https://androidnetworktester.googlecode.com/files/1mb.txt ile çalıştığı için indirmeye çalıştığınız dosyadır.

Sorun, dosyanızın söylediklerinden daha büyük olmasıdır. Content_length_proc, 8549968 bayt (8.15MB) iken, 101187668 bayt (96.5MB) olduğunu bildirir (dosyayı indirdikten sonra ls ile kontrol edin). Şimdi çökmesine ve size bir progressbar verir vermez bir alternatif var:

def http_download_with_words(uri, filename) 
    bytes_total = nil 
    uri.open(
      read_timeout: 500, 
      :content_length_proc => lambda{|content_length| 
      bytes_total = content_length}, 
      :progress_proc => lambda{|bytes_transferred| 
      if bytes_total 
       # Print progress 
       print("\r#{bytes_transferred}/#{bytes_total}") 
      else 
       # We don’t know how much we get, so just print number 
       # of transferred bytes 
       print("\r#{bytes_transferred} (total size unknown)") 
      end 
      } 
      ) do |file| 
    open filename, 'w' do |io| 
     file.each_line do |line| 
     io.write line 
     end 
    end 
    end 
end 

http_download_with_words(URI('http://data.wien.gv.at/daten/geo?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien%3aBAUMOGD&srsName=EPSG:4326'), 'temp.txt') 

kendini açıklayıcı güzel, (here görüldü.)

Şimdi bölüm I anlamaya edemedik progressbar gem tam olarak ZLib ile müdahale ediyor. Proseslerin çoğunda işler iyi işliyor gibi görünüyor (örneğin, rastgele şeyler yazdırarak) bu nedenle, her iki ilerleme çubuğu da, bir şekilde aktarımla uğraşacak şekilde tamamlandığında tuhaf şeyler yapıyor. Birinin neden olduğunu anlayabilmesi çok isterim.

+0

Güzel araştırmalar. Dosya boyutundaki farkı fark etmedim. Çok kötü, mücevherlerden biri ile çalışmaz. Ne yazık ki bakıcı taleplerimi görmezden geliyor gibi görünüyor. Çözümünüzü takip eden günlerde entegre etmeye çalışacağım. – JJD

+0

Şimdi denedim (tatilden sonra). İyi çalışıyor. Bu durumda görsel ilerleme çubuğundan vazgeçebilirim. Teşekkür ederim. – JJD

2

Bunun gerçekleşmesi durumunda yaptığım testlerde, #set'deki artıştan kaynaklanıyordu. Zlib'de neden bir hataya neden olduğu konusunda, bu net değil. Belki de bazı garip istisnalar var. Benim durumumda, sorunu gidermek için "progbar.set (count) kurtarma" nil "yaptım".