【问题标题】:How to verify that IO.copy_stream was successful如何验证 IO.copy_stream 是否成功
【发布时间】:2016-06-21 20:24:22
【问题描述】:

这里的一个很好的答案解释了如何在 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 返回它复制的字节数,但是当我还没有下载文件时,我怎么知道预期的字节数?

【问题讨论】:

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

标签: ruby


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多