2

我的代码:

require 'rio'
rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733.jpg?v=0')

但是下载的图像已损坏。这个解决方案有什么问题?

4

6 回答 6

3

pjb3 是正确的。您必须在左侧术语上调用binmode :

rio('nice.jpg').binmode < rio('http://...')

如果这仍然不起作用(尤其是大型 jpeg 文件可能会发生这种情况,即 rio 在从您提供的 URL 检索时使用中间临时文件),则将binmode修饰符应用于这两个术语:

rio('nice.jpg').binmode < rio('http://...').binmode

2011 更新

根据 Luke C. 的说法,上述答案不再适用于 gem 的更新版本:

这些都不起作用。在 Linux 上,在目标上设置了 .binmode 会导致 Errno::ENOENT 异常。做: rio('nice.jpg') < rio('http://...').binmode 有效

于 2009-02-21T19:24:02.980 回答
1

这个对我有用。你在窗户上吗?这可能是因为没有使用二进制标志打开文件。

于 2009-02-21T14:59:39.543 回答
1

我在 Linux 上下载图像时遇到了类似的问题,我发现这对我有用:

rio(source_url).binmode > rio(文件名)

于 2009-12-01T19:21:54.603 回答
1

这是一些用于下载图像的简单 ruby​​ 代码

require 'net/http'
url = URI.parse("http://www.somedomain.com/image.jpg")
Net::HTTP.start(url.host, url.port) do |http|
  resp, data = http.get(url.path, nil)
  open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
end

这甚至可以扩展到跟随重定向:

require 'net/http'
url = URI.parse("http://www.somedomain.com/image.jpg")
Net::HTTP.start(url.host, url.port) do |http|
  resp, data = http.get(url.path, nil)
  prev_redirect = ''
  while resp.header['location']
    raise "Recursive redirect: #{resp.header['location']}" if prev_redirect == resp.header['location']
    prev_redirect = resp.header['location']
    url = URI.parse(resp.header['location'])
    host = url.host if url.host
    port = url.port if url.port
    http = Net::HTTP.new(host, port)
    resp, data = http.get(url.path, nil)
  end
  open( File.join(File.dirname(__FILE__), "image.jpg"), "wb" ) { |file| file.write(resp.body) }
end

它可能会被美化一些,但它可以完成工作,并且不依赖于任何第 3 方宝石!:)

于 2011-08-11T09:31:24.067 回答
0

我想这是一个错误。在 Windows 上,所有 0x0A 都替换为 0x0D 0x0A。因此,在 Linux 上正确使用(使用 .binmode)是有道理的。

于 2009-12-07T00:03:39.473 回答
0

要从网页下载图片,可以使用 ruby​​ gemimage_downloader

于 2011-07-26T08:11:37.803 回答