如何验证IO.copy_stream是否成功

jos*_*eir 5 ruby

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

/sf/answers/2082037611/

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

我如何验证下载文件的IO.copy_stream调用是否实际成功 - 这意味着下载的文件与我打算下载的文件完全相同,而不是下载了一半的损坏文件?该文件说,IO.copy_stream返回它复制的字节数,但我怎么能知道什么时候我还没有下载的文件,但预期的字节数?

Dav*_*uth 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
Run Code Online (Sandbox Code Playgroud)

如果open执行没有错误,这将是令人惊讶的,这个检查仍然失败,但你永远不会知道.