2016-03-08 38 views
5

Eine große Antwort hier erklärt, wie, in Ruby, eine Datei herunterzuladen, ohne sie in den Speicher zu laden:Wie zu überprüfen, ob IO.copy_stream erfolgreich war

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

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

Wie würde ich überprüfen, ob die IO.copy_stream Aufruf zum Download der Datei war tatsächlich erfolgreich - was bedeutet, dass die heruntergeladene Datei ist genau die gleiche Datei, die ich herunterladen wollte, nicht eine Hälfte heruntergeladene beschädigte Datei? Die documentation besagt, dass IO.copy_stream die Anzahl der Bytes, die es kopiert hat, zurückgibt, aber wie kann ich die Anzahl der erwarteten Bytes wissen, wenn ich die Datei noch nicht heruntergeladen habe?

+0

Was bedeutet Erfolg für Sie? Dass die richtige Anzahl von Bytes auf der Festplatte ist? Dass die Datei eine gültige Datei ihres Typs ist? Etwas anderes? –

+0

@DaveSchweisguth Sorry, ich dachte, es wäre selbsterklärend. Dass die heruntergeladene Datei eine exakte Kopie der Datei an der URL ist. Ich würde automatisch denken, aber ich weiß, dass das nicht möglich ist. Vielleicht ist die einzige Möglichkeit zu überprüfen, ob die Größe der Dateien übereinstimmt? – joshweir

+1

Sie sollten hier vorsichtig sein: Server müssen nicht 'Content-Length' in den Headern zurückgeben. –

Antwort

5

openURI open gibt ein Objekt zurück, das die HTTP-Antwort des Header aussetzt, so dass Sie die erwartete Byteanzahl von den Content-Length-Header erhalten und es auf den Rückgabewert von IO.copy_stream vergleichen:

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 

Es wäre überraschend, wenn open ohne Fehler ausgeführt und diese Prüfung immer noch fehlgeschlagen ist, aber man kann nie wissen.

Verwandte Themen