ruby - 从 URL 下载图像?

标签 ruby httpwebrequest javax.imageio

我正在尝试使用 HTTP::get 从我创建的 URL 下载 Google 图表的图像。

这是我的第一次尝试:

failures_url  = [title, type, data, size, colors, labels].join("&")

require 'net/http'

Net::HTTP.start("http://chart.googleapis.com") { |http|
  resp = http.get("/chart?#{failures_url")
  open("pie.png" ,"wb") { |file|
    file.write(resp.body)
  }
}

只生成一个空的 PNG 文件。

第二次尝试时,我在 http.get() 调用中使用了存储在 failure_url 中的值。

require 'net/http'

Net::HTTP.start("http://chart.googleapis.com") { |http|
  resp = http.get("/chart?chtt=Builds+in+the+last+12+months&cht=bvg&chd=t:296,1058,1217,1615,1200,611,2055,1663,1746,1950,2044,2781,1553&chs=800x375&chco=4466AA&chxl=0:|Jul-2010|Aug-2010|Sep-2010|Oct-2010|Nov-2010|Dec-2010|Jan-2011|Feb-2011|Mar-2011|Apr-2011|May-2011|Jun-2011|Jul-2011|2:|Months|3:|Builds&chxt=x,y,x,y&chg=0,6.6666666666666666666666666666667,5,5,0,0&chxp=3,50|2,50&chbh=23,5,30&chxr=1,0,3000&chds=0,3000")
  open("pie.png" ,"wb") { |file|
    file.write(resp.body)
  }
}

而且,出于某种原因,即使第一次尝试在 http.get() 调用中有相同的数据,这个版本仍然有效。有谁知道这是为什么吗?

解决方案:

在试图弄清楚为什么会发生这种情况后,我发现了“How do I download a binary file over HTTP?”。

其中一条评论提到在 Net::HTTP.start(...) 调用中删除 http:// 否则它不会成功。果然在我这样做之后:

failures_url  = [title, type, data, size, colors, labels].join("&")

require 'net/http'

Net::HTTP.start("chart.googleapis.com") { |http|
  resp = http.get("/chart?#{failures_url")
  open("pie.png" ,"wb") { |file|
    file.write(resp.body)
  }
}

它起作用了。

最佳答案

我会使用 Ruby 的 Open::URI 来查找文件:

require "open-uri"

File.open('pie.png', 'wb') do |fo|
  fo.write open("http://chart.googleapis.com/chart?#{failures_url}").read 
end

我更喜欢 Open::URI 的原因是它会自动处理重定向,因此当 Google 对其后端进行更改并尝试重定向 URL 时,代码会神奇地处理它。如果我没记错的话,它还可以更优雅地处理超时和重试。

如果您必须拥有较低级别的控制权,那么我会看看 Ruby 的许多其他 HTTP 客户端之一; Net::HTTP 适用于创建新服务或当客户端不存在时,但我会使用 Open::URI 或 Net::HTTP 以外的其他东西,直到需要出现为止。


网址:

http://chart.googleapis.com/chart?chtt=Builds+in+the+last+12+months&cht=bvg&chd=t:296,1058,1217,1615,1200,611,2055,1663,1746,1950,2044,2781,1553&chs=800x375&chco=4466AA&chxl=0:|Jul-2010|Aug-2010|Sep-2010|Oct-2010|Nov-2010|Dec-2010|Jan-2011|Feb-2011|Mar-2011|Apr-2011|May-2011|Jun-2011|Jul-2011|2:|Months|3:|Builds&chxt=x,y,x,y&chg=0,6.6666666666666666666666666666667,5,5,0,0&chxp=3,50|2,50&chbh=23,5,30&chxr=1,0,3000&chds=0,3000

使 URI 困惑。我怀疑它看到了应该在 URL 中编码的字符。

出于文档目的,以下是 URI 在尝试按原样解析该 URL 时所说的内容:

URI::InvalidURIError: bad URI(is not URI?)

如果我先对 URI 进行编码,我会得到一个成功的解析。使用 Open::URI 进一步测试表明它能够在该点检索文档并返回 23701 字节。

我认为,如果其中一些字符确实不被 URI 接受并且它们不在 RFC 范围内,我认为这是解决问题的适当方法。

仅供引用,Addressable::URI gem 是内置 URI 的绝佳替代品。

关于ruby - 从 URL 下载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6768238/

相关文章:

c# - 尝试单击按钮登录网站

java - ImageIO.read() 返回 403 错误

ruby - 您可以通过 site-prism 或仅通过 css 选择器按 id、标题、链接等查找元素吗?

ruby-on-rails - 在 ruby​​ worker 中使用 Carrierwave 保存图像

ruby-on-rails - Rails ActionCable 在浏览器关闭时取消订阅用户

http - 如何用Fiddler模​​拟超时

.net - HttpWebRequest 的 Socks 代理

java - jar 中提供什么格式的大背景图像?

java - 如何使用 IIOImage 读取图像并获取光栅

Ruby dig set - 使用 Hash#dig 分配值