如何使用Ruby下载图片?

Rog*_*ger 26 ruby http

我想用Ruby下载这张图片.我怎么做?

http://farm1.static.flickr.com/92/218926700_ecedc5fef7_o.jpg
Run Code Online (Sandbox Code Playgroud)

我正在使用Mac OS.

Geo*_*Geo 54


require "open-uri"

open("your-url") {|f|
   File.open("whatever_file.jpg","wb") do |file|
     file.puts f.read
   end
}


Run Code Online (Sandbox Code Playgroud)

  • 这不是内存效率,因为它将整个图像内容读入内存.最好的方法(没有多少人知道)是`IO.copy_stream(f,file)`.这将以最有效的方式将内容从一个IO复制到另一个IO. (6认同)
  • 切向,如果你在Windows上(与OP不同),你需要以二进制模式打开文件:File.open(filename,'w').binmode do | file | ... (4认同)
  • 我认为这可以写得更简洁:`File.write('whatever_file.jpg',open('your-url').read,{mode:'wb'})`. (3认同)

Ste*_*anu 17

尝试使用Mechanize gem:

开始于:sudo gem install mechanize安装Mechanize.

然后:

require 'rubygems'
require 'mechanize'

agent = Mechanize.new
link = 'http://www.asite.com/pic.jpg'
agent.get(link).save "images/pic.jpg" 
Run Code Online (Sandbox Code Playgroud)

编辑:为了使事情更清洁,我建议您在保存图像时使用文件名称.我在保存批量图像时遇到了问题,因为它们没有正确格式化.图像保存如下:

#pic.jpg(1)
#pic.jpg(2)
#etc.
Run Code Online (Sandbox Code Playgroud)

这就是为什么你应该使用图像名称作为文件名,如下所示:

agent.get(src).save "images/#{File.basename(url)}"
Run Code Online (Sandbox Code Playgroud)

File.basename采用图片网址,只返回实际的图片名称:

File.basename("http://www.asite.com/pic.jpg")
# returns the image name
pic.jpg
Run Code Online (Sandbox Code Playgroud)