Ruby 通过Net::HTTP下载zip文件
我正在尝试使用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.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'。