如何验证IO.copy_stream成功

问题描述:

一个伟大的答案在这里介绍了如何在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”。 –

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执行没有错误,并且该检查仍然失败,但你永远不知道。