2016-03-08 8 views
5

Wielki odpowiedź tutaj wyjaśnia, jak w Ruby, aby pobrać plik bez załadowanie go do pamięci:Jak sprawdzić, IO.copy_stream powiodła

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

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

Jak chciałbym sprawdzić, czy Wywołanie IO.copy_stream, aby pobrać plik, faktycznie zakończyło się sukcesem - co oznacza, że ​​pobrany plik jest dokładnie tym samym plikiem, który zamierzałem pobrać, a nie pobranym do połowy uszkodzonym plikiem? documentation mówi, że IO.copy_stream zwraca liczbę bajtów, które skopiował, ale skąd mogę wiedzieć, ile bajtów oczekuje, gdy jeszcze nie pobrałem pliku?

+0

Co oznacza dla ciebie sukces? Czy odpowiednia liczba bajtów znajduje się na dysku? Czy plik jest prawidłowym plikiem tego typu? Coś innego? –

+0

@DaveSchweisguth Przepraszam, że myślałem, że to by było zrozumiałe. To, że pobrany plik jest dokładną kopią pliku pod adresem URL. Automatycznie pomyślałem cksum, ale wiem, że to nie jest możliwe. Więc może jedyną opcją jest sprawdzenie, czy rozmiar plików jest zgodny? – joshweir

+1

Powinieneś być ostrożny: serwery nie muszą zwracać "Content-Length" w nagłówkach. –

Odpowiedz

5

OpenURI open zwraca obiekt, który odsłania nagłówków odpowiedzi HTTP, dzięki czemu można uzyskać oczekiwaną liczbę bajtów z nagłówka Content-Length i porównać ją do wartości zwracanej 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 

byłoby zaskakujące, jeśli open wykonane bez błędu, a to sprawdzenie nadal nie powiodło się, ale nigdy nie wiadomo.

Powiązane problemy