如何验证IO.copy_stream是否成功

时间:2016-03-08 02:57:12

标签: ruby

这里的一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:

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返回它复制的字节数,但是如果我还没有下载文件,我怎么知道预期的字节数呢?

1 个答案:

答案 0 :(得分:8)

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执行没有错误并且此检查仍然失败,那将是令人惊讶的,但你永远不会知道。