从 URL 下载图像? [英] Download an image from a URL?

查看:34
本文介绍了从 URL 下载图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to use HTTP::get to download an image of a Google chart from a URL I created.

这是我的第一次尝试:

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 文件.

Which produced only an empty PNG file.

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

For my second attempt I used the value stored inside failure_url inside the http.get() call.

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() 调用中具有相同的数据,该版本仍然有效.有谁知道这是为什么?

And, for some reason, this version works even though the first attempt had the same data inside the http.get() call. Does anyone know why this is?

解决方案:

在试图弄清楚为什么会发生这种情况后,我发现如何通过 HTTP 下载二进制文件?".

After trying to figure why this is happening I found "How do I download a binary file over HTTP?".

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

One of the comments mentions removing http:// in the Net::HTTP.start(...) call otherwise it won't succeed. Sure enough after I did this:

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 的 打开::URI:

I'd go after the file using Ruby's 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 时,代码会神奇地处理它.如果我没记错的话,它还可以更优雅地处理超时和重试.

The reason I prefer Open::URI is it handles redirects automatically, so WHEN Google makes a change to their back-end and tries to redirect the URL, the code will handle it magically. It also handles timeouts and retries more gracefully if I remember right.

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

If you must have lower level control then I'd look at one of the many other HTTP clients for Ruby; Net::HTTP is fine for creating new services or when a client doesn't exist, but I'd use Open::URI or something besides Net::HTTP until the need presents itself.

网址:

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 中编码的字符.

makes URI upset. I suspect it is seeing characters that should be encoded in URLs.

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

For documentation purposes, here is what URI says when trying to parse that URL as-is:

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

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

If I encode the URI first, I get a successful parse. Testing further using Open::URI shows it is able to retrieve the document at that point and returns 23701 bytes.

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

I think that is the appropriate fix for the problem if some of those characters are truly not acceptable to URI AND they are out of the RFC.

仅供参考,Addressable::URI gem 是内置 URI 的绝佳替代品.

Just for information, the Addressable::URI gem is a great replacement for the built-in URI.

这篇关于从 URL 下载图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆