如何通过HTTP下载唯一的一块红宝石大文件(How to download via HTTP onl

2019-06-25 19:03发布

我只需要通过HTTP下载文件的前几个字节。

我试过了

require 'open-uri'
url = 'http://example.com/big-file.dat'
file = open(url)
content = file.read(limit)

但它实际上下载完整的文件。

Answer 1:

这似乎使用插座时工作:

require 'socket'                  
host = "download.thinkbroadband.com"                 
path = "/1GB.zip" # get 1gb sample file
request = "GET #{path} HTTP/1.0\r\n\r\n"
socket = TCPSocket.open(host,80) 
socket.print(request)        

# find beginning of response body
buffer = ""                    
while !buffer.match("\r\n\r\n") do
  buffer += socket.read(1)  
end           

response = socket.read(100) #read first 100 bytes of body
puts response

我很好奇,如果有一个“红宝石路”。



Answer 2:

这是一个古老的线程,但它仍然似乎大多没有答案,根据我的研究的问题。 下面是我通过猴子打补丁的Net :: HTTP有点想出了一个解决方案:

require 'net/http'

# provide access to the actual socket
class Net::HTTPResponse
  attr_reader :socket
end

uri = URI("http://www.example.com/path/to/file")
begin
  Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Get.new(uri.request_uri)
    # calling request with a block prevents body from being read
    http.request(request) do |response|
      # do whatever limited reading you want to do with the socket
      x = response.socket.read(100);
    end
  end
rescue IOError
  # ignore
end

救援捕捉,当你调用过早那HTTP.finish抛出真实的IO错误。

仅供参考,内插座HTTPResponse对象不是真正的IO对象(这就是所谓的一个内部类BufferedIO ),但它是很容易猴补丁,也模仿IO你需要的方法。 例如,我使用(EXIFR)另一个库所需的readchar方法,这是很容易添加:

class Net::BufferedIO
  def readchar
    read(1)[0].ord
  end
end


Answer 3:

退房“ OpenURI返回两个不同的对象 ”。 您可能能够滥用在那里的方法来中断下载/预设的限制后扔掉的结果的其余部分。



文章来源: How to download via HTTP only piece of big file with ruby
标签: ruby http fetch