Ruby - 远程文件下载...超时?

时间:2011-08-03 17:16:35

标签: ruby ssl file-upload download stream

请原谅选项卡。我正在尝试将文件从远程下载到本地,并且我不断收到一个正好是310字节的文件(无论我选择下载哪个文件)。我尝试将超时设置为0,但这不起作用。我究竟做错了什么?谢谢!

        @downloadUrl = 'https://username:password@api.net'
        Net::HTTP.start(@downloadUrl) do |http|
            response = http.get('/file.ext')
            open('/Users/me/file.ext', "wb", :read_timeout=>0) do |file|
                file.write(response.body)
            end
        end
编辑:我不想使用httpclient,我想使用标准的net / http。我几乎在那里,但我不断向initialize': getaddrinfo: nodename nor servname provided, or not known (SocketError)投掷Net::HTTP.start(url.path)。但当我远程“https”时,我得到ECONNREFUSED。 ......越来越近了?

    url = URI.parse('https://api.net/file.ext') 
    @request = Net::HTTP.start(url.path)
    @request.basic_auth 'username', 'password'
    sock = Net::HTTP.new(url.host, 443)
    sock.use_ssl = true
    sock.ssl_version='SSLv3'
    sock.start do |http|
        response = http.get(@request)
            open('/Users/me/file.ext', "wb", :read_timeout=>0) do |file|
                file.write(response.body)
            end
    end

1 个答案:

答案 0 :(得分:0)

通过SSL访问时,使用httpclient要简单得多。

gem install httpclient

我没有试过这个,但这对你有用。这是rdoc

require 'httpclient'

domain    = "https://api.net/file.ext"
username  = "username"
password  = "password"

clnt = HTTPClient.new
clnt.set_auth(domain, username, password)

res = clnt.get_content(https_url)

您可以参考"writing a binary file in ruby"问题将答案保存到文件中。

已更新使用net / http

您应该Net::HTTP.start(url.host, url.port)而不是Net:HTTP.start(url.path)See RDoc for Net::HTTP.start

url = URI.parse("https://api.net/file.ext")
download_file = opne("/Users/me/file.ext", "wb")
request = Net::HTTP.start(url.host, url.port)

# .. set basic auth, verify peer etc

begin
  request.request_get(url.path) do |resp|
    resp.read_body { |segment| download_file.write(segment) }
  end
ensure
  download_file.close
end