我正在尝试使用ruby脚本在http链接上下载.dmg文件。我尝试过http://www.ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTP.html中描述的NET :: HTTP和HTTParty方法 这些方法适用于图像和其他Web内容,但不适用于dmg文件。
#!/usr/bin/env ruby
require 'fileutils'
require 'pathname'
require "open-uri"
require 'net/http'
include FileUtils
#download Software
#Method1
open("VirtualBox-4.2.18-88780-OSX.dmg") do |file|
file.write('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg').read
end
#Method2
Net::HTTP.start("download.virtualbox.org") do |http|
resp = http.get("/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg")
open("VirtualBox-4.2.18-88780-OSX.dmg","wb") do |file|
file.write(resp)
end
end
#Method3
uri = URI('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780- OSX.dmg')
Net::HTTP.get(uri)
#Method4
Net::HTTP.start(uri.host) do |http|
request = Net::HTTP::Get.new uri
response = http.request request # Net::HTTPResponse object
end
#Method5
File.open("~/Desktop/", "wb") do |f|
f.write HTTParty.get("http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18- 88780-OSX.dmg").parsed_response
end
#Method6
File.write('VirtualBox-4.2.18-88780-OSX.dmg', open('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg').read, {mode: 'wb'})
#Methos7
puts "#{uri}"
res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)
如何通过http链接获取dmg文件。
答案 0 :(得分:1)
我认为这是由于重定向:
→ curl -I http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
HTTP/1.1 302 Moved Temporarily
Location: http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
→ curl -I http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
HTTP/1.1 200 OK
Content-Length: 110667450
下载真实网址的工作原理如下:
require 'net/http'
url = "http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg"
File.open('tmp.dmg', 'w') { |f| f.write Net::HTTP.get_response(URI.parse(url)).body }
答案 1 :(得分:0)
对我来说,这段代码就像一个魅力:
Net::HTTP.start("dlc.sun.com.edgesuite.net") do |http|
begin
file = open("VirtualBox-4.2.18-88780-OSX.dmg", 'wb')
http.request_get('/' + URI.encode("virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg")) do |response|
response.read_body do |segment|
file.write(segment)
end
end
ensure
end
end
答案 2 :(得分:-2)
尝试像wget
这样的shell命令,并在Ruby
system
执行它
system('wget http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18- 88780-OSX.dmg')