2016-03-08 6 views
5

Una grande risposta qui spiega come, in Ruby, per scaricare un file senza caricarla in memoria:Come verificare che IO.copy_stream ha avuto successo

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

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

Come faccio a verificare che il La chiamata a IO.copy_stream per scaricare il file è stata effettivamente efficace, il che significa che il file scaricato è lo stesso file che avevo intenzione di scaricare, non un file corrotto scaricato a metà? Il documentation dice che IO.copy_stream restituisce il numero di byte che ha copiato, ma come posso sapere il numero di byte previsti quando non ho ancora scaricato il file?

+0

Che cosa significa per te il successo? Che il numero giusto di byte sono sul disco? Che il file è un file valido del suo tipo? Qualcos'altro? –

+0

@DaveSchweisguth Scusa ho pensato che sarebbe stato di per sé esplicativo. Che il file scaricato sia una copia esatta del file nell'URL. Penserei automaticamente cksum ma so che non è possibile. Quindi forse l'unica opzione è verificare che la dimensione dei file corrisponda? – joshweir

+1

Qui dovresti fare attenzione: i server non sono tenuti a restituire "Content-Length" nelle intestazioni. –

risposta

5

OpenURI open restituisce un oggetto che espone le intestazioni della risposta HTTP, in modo da poter ottenere il conteggio di byte previsto dalla intestazione Content-Length e confrontarlo con il valore di ritorno di IO.copy_stream:

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 

Sarebbe sorprendente se open eseguito senza errori e questo controllo ancora non è riuscito, ma non si sa mai.