我的代码:
require 'rio'
rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733.jpg?v=0')
但下载的图片已损坏。这个解决方案有什么问题?
答案 0 :(得分:3)
pjb3是正确的。您必须在左侧术语上致电binmode:
rio('nice.jpg').binmode < rio('http://...')
如果这仍然不起作用(特别是,对于大型jpeg文件,可能会发生这种情况,即rio在从您提供的URL中检索时使用中间临时文件),然后将binmode
修饰符应用于这两个术语:
rio('nice.jpg').binmode < rio('http://...').binmode
根据Luke C.的说法,上述答案不再适用于更新版本的宝石:
这些都不奏效。在目的地上设置.binmode的Linux上会导致Errno :: ENOENT异常。做:rio('nice.jpg')&lt; rio('http:// ...')。binmode工作
答案 1 :(得分:1)
它对我有用。你在窗户吗?这可能是因为没有使用二进制标志打开文件。
答案 2 :(得分:1)
我在Linux上下载图像有类似的问题,我发现这对我有用:
rio(source_url).binmode&gt; rio(文件名)
答案 3 :(得分: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
它可能会被某些人打扮,但它完成了工作,并且不依赖于任何第三方宝石! :)
答案 4 :(得分:0)
我猜这是一个错误。在Windows上,所有0x0A都替换为0x0D 0x0A。因此,正确使用(使用.binmode)它可以在Linux上运行。
答案 5 :(得分:0)
要从网页下载图片,您可以使用ruby gem image_downloader