Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 通过Net::HTTP下载zip文件_Ruby - Fatal编程技术网

Ruby 通过Net::HTTP下载zip文件

Ruby 通过Net::HTTP下载zip文件,ruby,Ruby,我正在尝试使用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" } 但这只给了我一个4KB的404错误HTML页面(如果我将文件改为a.txt)。我想

我正在尝试使用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"
}

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

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
需要“net/http”
类重定向跟随器
类TooManyRedirects
我的第一个问题是,为什么要使用Net::HTTP或代码来下载一些可以更轻松地使用curl或wget完成的东西,它们的设计目的是使文件下载更容易

但是,既然您想使用代码下载东西,我建议您看看是否要遵循重定向。它是Ruby的标准库,对于快速HTTP/FTP访问页面和文件非常有用:

require 'open-uri'

open('latest.zip', 'wb') do |fo|
  fo.print open('http://wordpress.org/latest.zip').read
end
我只是运行了它,等待了几秒钟,然后对下载的文件“latest.zip”进行解压缩,并将其扩展到包含其内容的目录中


除了开放URI之外,还有HTTPClient和Typhous等,它们使打开HTTP连接和发送查询器/接收数据变得容易。它们非常强大,值得了解。

谢谢!我已经为此挣扎了一段时间。HTTP确实不能很好地处理重定向。谢谢你的片段!你让我非常高兴。谢谢我将JRuby用于一个应用程序,由于某种原因,我无法使用它,我开始研究Net::HTTP。我不知道开放式uriwich似乎更可行。我会留意的。非常感谢你的提示!我也想接受这个答案。但是我已经接受了一个答案,这个问题特别是关于NET:HTTPI也会推荐,它允许你对一个普通的网络接口进行编码,并让你在下面切换这个库。answers@the锡人-非常感谢你。我在
IO:copy\u stream
方面遇到问题。你的解决方案帮了我大忙!如果可能的话,请回答我的问题-“IO:Class的Ruby未定义方法`copy_stream'。