2016-03-08 17 views
5
Büyük cevap burada Ruby, belleğe yüklenerek olmadan bir dosya indirmek için nasıl açıklıyor

: Nasıl doğrulamak ediyorumIO.copy_stream başarılı olduğunu doğrulamak için nasıl

https://stackoverflow.com/a/29743394/4852737

require 'open-uri' 
download = open('http://example.com/image.png') 
IO.copy_stream(download, '~/image.png') 

Dosyayı indirmek için IO.copy_stream çağrısı aslında başarılı oldu - yani indirilen dosyanın indirilen dosyayı indirmeye çalıştığım tam bir dosya değil, yarım indirilen bozuk dosya değil mi? documentation, IO.copy_stream dosyasının kopyaladığı bayt sayısını döndürdüğünü söylüyor ancak dosyayı henüz indirmediğimde beklenen bayt sayısını nasıl bilebilirim?

require 'open-uri' 
download = open 'http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png' 
bytes_expected = download.meta['content-length'] 
bytes_copied = IO.copy_stream download, 'image.png' 
if bytes_expected != bytes_copied 
    raise "Expected #{bytes_expected} bytes but got #{bytes_copied}" 
end 

O olacaktır: İçerik-Uzunluk başlığından beklenen bayt sayısını almak ve IO.copy_stream dönüş değerine karşılaştırabilirsiniz böylece

+0

Başarı sizin için ne anlama geliyor? Doğru sayıda bayt diskte mi? Bu dosya kendi türünde geçerli bir dosya mı? Başka bir şey? –

+0

@DaveSchweisguth Üzgünüm Kendi kendini açıklayıcı olacağını düşündüm. İndirilen dosya, url'deki dosyanın tam bir kopyasıdır. Otomatik olarak cksum düşünürdüm ama bunun mümkün olmadığını biliyorum. Belki de tek seçenek dosyaların boyutunun eşleştiğini doğrulamaktır? – joshweir

+1

Burada dikkatli olmalısınız: sunucuların başlıklarda 'İçerik Uzunluğu' değerini döndürmesi gerekmez. –

cevap

5

openURI open, HTTP yanıt başlıklarını ortaya bir nesne döndürür open hatasız yürütüldüğünde ve bu kontrol hala başarısız olursa şaşırtıcıdır, ama asla bilmezsiniz.

İlgili konular