2016-03-08 38 views
5

一個偉大的答案在這裏介紹瞭如何在Ruby中,下載文件,而無需加載到內存:如何驗證IO.copy_stream成功

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

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

我將如何驗證調用IO.copy_stream來下載文件實際上是成功的 - 意味着下載的文件與我打算下載的文件完全相同,而不是下載的一半損壞的文件? documentation表示IO.copy_stream返回它複製的字節數,但是如何知道尚未下載文件時預期的字節數?

+0

成功對你意味着什麼?磁盤上正確的字節數是多少?該文件是其類型的有效文件?還有別的嗎? –

+0

@DaveSchweisguth對不起,我認爲這將是自我解釋。下載的文件是url處文件的精確副本。我會自動思考cksum,但我知道這不可能。所以也許唯一的選擇是驗證文件的大小是否匹配? – joshweir

+1

您應該小心:服務器不需要在標題中返回「Content-Length」。 –

回答

5

OpenURI open返回暴露HTTP響應的頭一個對象,所以你可以從Content-Length頭的預期字節數和比較它的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 

這將是令人驚訝的是,如果open執行沒有錯誤,並且該檢查仍然失敗,但你永遠不知道。