Ruby 如何验证IO.copy_流是否成功

Ruby 如何验证IO.copy_流是否成功,ruby,Ruby,这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中: 我如何验证下载文件的IO.copy_流调用是否实际成功?这意味着下载的文件与我打算下载的文件完全相同,而不是下载了一半的损坏文件?表示IO.copy_流返回它复制的字节数,但是当我还没有下载该文件时,如何知道预期的字节数 OpenURIopen返回一个对象,该对象公开HTTP响应的头,因此您可以从内容长度头中获取预期的字节数,并将其与IO的返回值进行比较。复制\u流: require 'open-uri' downloa

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


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

OpenURI
open
返回一个对象,该对象公开HTTP响应的头,因此您可以从内容长度头中获取预期的字节数,并将其与
IO的返回值进行比较。复制\u流

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
执行时没有出现错误,而该检查仍然失败,这将是令人惊讶的,但您永远不知道。

成功对您意味着什么?磁盘上的字节数是否正确?该文件是否为其类型的有效文件?还有别的吗?@Daveshweisguth抱歉,我以为这是不言自明的。下载的文件是url上文件的精确副本。我会自然而然地想到cksum,但我知道这是不可能的。所以,也许唯一的选择是验证文件的大小是否匹配?在这里您应该小心:服务器不需要在标题中返回“Content Length”。
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