2011-03-22 9 views
4

Net :: HTTP를 사용하여 WordPress.org에서 latest.zip을 다운로드하려고합니다.Net :: HTTP를 통해 zip 파일 다운로드

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

그러나 (내가 a.txt이 할 파일을 변경하는 경우)이 단지 나에게 4킬로바이트 404 오류 HTML 페이지를 제공합니다 : 이것은 내가 지금까지 가지고 것입니다. 나는 이것이 URL과 관련이 있다고 생각하고 있는데, 아마도 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는 리디렉션을 멋지게 처리하지 않습니다. 발췌 해 주셔서 감사합니다! – maetthew

+0

당신은 저를 너무 행복하게했습니다. 감사! – Stone

8

내 첫 번째 질문은 인터넷을 사용하는 이유는 :: 파일을 쉽게 다운로드 할 수 있도록 설계된 말풍선이나 wget을 사용하여보다 쉽게 ​​할 수있는 것을 다운로드하는 HTTP 또는 코드?

그러나 코드를 사용하여 다운로드하려는 것이므로 리디렉션을 따르려면 Open-URI을 확인하는 것이 좋습니다. 그것의 표준 루비 라이브러리, 빠른 HTTP/페이지 및 파일에 대한 FTP 액세스를위한 매우 유용합니다 : 난 그냥 끝날 때까지 몇 초를 기다린 실행

require 'open-uri' 

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

은 다운로드 한 파일 "최신에 대한 압축을 풀고 실행 .zip "으로 변경되고 내용이 포함 된 디렉토리로 확장됩니다.

HTTP 연결을 열고 발신자/수신 데이터를 쉽게 보낼 수 있도록 HTTPClient 및 Typhoeus가 있습니다. 그들은 매우 강력하고 알 가치가 있습니다.

+0

나는 JRuby를 어떤 이유로 연석을 사용할 수없는 응용 프로그램에 사용하고 Net :: HTTP를 살펴보기 시작했습니다. 훨씬 더 실용적인 것처럼 보이는 Open URI를 알지 못했습니다. 그것을 들여다 볼 것입니다. 팁을 주셔서 대단히 감사합니다! 이 대답도 받아 들일 수 있었습니까? 그러나 나는 이미 대답을 받아 들였고 그 질문은 구체적으로 인터넷에 관한 것입니다 : HTTP – maetthew

+0

https://github.com/rubiii/httpi를 권하고 싶습니다. 일반적인 네트워크 인터페이스에 맞춰 코드를 작성할 수 있으며 아래의 라이브러리를 전환 할 수 있습니다 . –

+0

나는이 대답을 위대한 대답으로 생각한다. – Stone

관련 문제