2011-03-22 134 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