我的代码:
require 'rio'
rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733.jpg?v=0')
但是下载的图像已损坏。这个解决方案有什么问题?
pjb3 是正确的。您必须在左侧术语上调用binmode :
rio('nice.jpg').binmode < rio('http://...')
如果这仍然不起作用(尤其是大型 jpeg 文件可能会发生这种情况,即 rio 在从您提供的 URL 检索时使用中间临时文件),则将binmode
修饰符应用于这两个术语:
rio('nice.jpg').binmode < rio('http://...').binmode
根据 Luke C. 的说法,上述答案不再适用于 gem 的更新版本:
这些都不起作用。在 Linux 上,在目标上设置了 .binmode 会导致 Errno::ENOENT 异常。做: rio('nice.jpg') < rio('http://...').binmode 有效
这个对我有用。你在窗户上吗?这可能是因为没有使用二进制标志打开文件。
我在 Linux 上下载图像时遇到了类似的问题,我发现这对我有用:
rio(source_url).binmode > rio(文件名)
这是一些用于下载图像的简单 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 方宝石!:)
我想这是一个错误。在 Windows 上,所有 0x0A 都替换为 0x0D 0x0A。因此,在 Linux 上正确使用(使用 .binmode)是有道理的。
要从网页下载图片,可以使用 ruby gemimage_downloader