如何验证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返回它复制的字节数,但是如何知道尚未下载文件时预期的字节数?
答
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
执行没有错误,并且该检查仍然失败,但你永远不知道。
成功对你意味着什么?磁盘上正确的字节数是多少?该文件是其类型的有效文件?还有别的吗? –
@DaveSchweisguth对不起,我认为这将是自我解释。下载的文件是url处文件的精确副本。我会自动思考cksum,但我知道这不可能。所以也许唯一的选择是验证文件的大小是否匹配? – joshweir
您应该小心:服务器不需要在标题中返回“Content-Length”。 –