2011-03-22 136 views
4

我正尝试使用Net :: HTTP从WordPress.org下载latest.zip。这是我这么远:通过Net :: HTTP下载压缩文件

Net::HTTP.start("wordpress.org/") { |http| 
    resp = http.get("latest.zip") 
    open("a.zip", "wb") { |file| 
    file.write(resp.body) 
    } 
    puts "WordPress downloaded" 
} 

但这只是给了我一个4千404错误HTML页(如果我改变文件a.txt中)。我认为这与URL有关,可能被重定向,但我不知道我在做什么。我是Ruby的新手。

回答

6

的Net :: HTTP不提供以下的重定向的一个很好的方式,这里是一段代码,我一直在使用,现在有一段:

require 'net/http' 
class RedirectFollower 
    class TooManyRedirects < StandardError; end 

    attr_accessor :url, :body, :redirect_limit, :response 

    def initialize(url, limit=5) 
    @url, @redirect_limit = url, limit 
    end 

    def resolve 
    raise TooManyRedirects if redirect_limit < 0 

    self.response = Net::HTTP.get_response(URI.parse(url)) 

    if response.kind_of?(Net::HTTPRedirection)  
     self.url = redirect_url 
     self.redirect_limit -= 1 

     resolve 
    end 

    self.body = response.body 
    self 
    end 

    def redirect_url 
    if response['location'].nil? 
     response.body.match(/<a href=\"([^>]+)\">/i)[1] 
    else 
     response['location'] 
    end 
    end 
end 



wordpress = RedirectFollower.new('http://wordpress.org/latest.zip').resolve 
puts wordpress.url 
File.open("latest.zip", "w") do |file| 
    file.write wordpress.body 
end 
+0

谢谢!一直在挣扎。 Net :: HTTP确实不INDEED NOT很好地处理重定向。谢谢你的片段! – maetthew 2011-03-22 03:06:03

+0

你让我好开心。谢谢! – Stone 2012-11-10 08:28:47

8

我的第一个问题是为什么使用网络:: HTTP或代码来下载使用curl或wget可以更容易地完成的事情,这些设计使得下载文件变得容易?

但是,既然你想使用代码下载东西,我建议你看看Open-URI如果你想遵循重定向。它的一个Ruby标准库,并快速HTTP/FTP访问网页和文件非常有用:

require 'open-uri' 

open('latest.zip', 'wb') do |fo| 
    fo.print open('http://wordpress.org/latest.zip').read 
end 

我只是跑了,等了几秒钟,它完成,运行解压对下载的文件“最新.zip“,并将其展开到包含其内容的目录中。

除了Open-URI之外,还有HTTPClient和Typhoeus等,它们可以很容易地打开HTTP连接并发送查询器/接收数据。他们非常强大,值得了解。

+0

我正在使用JRuby,因为某些原因我无法使用curb的应用程序,我开始考虑Net :: HTTP。我不知道Open URI,这似乎更可行。将着眼于它。非常感谢你的提示!也想接受这个答案。但我已经接受了一个答案,并且问题特别是关于Net:HTTP – maetthew 2011-03-22 07:08:52

+0

我也推荐https://github.com/rubiii/httpi,它允许您针对通用网络接口进行编码并允许您切换下面的库。 – 2012-04-04 08:46:21

+0

我认为这两个答案都是很好的答案 – Stone 2012-11-10 08:29:12