Frage

Ich brauche nur die ersten paar Kilobytes einer Datei über HTTP heruntergeladen werden.

Ich habe versucht,

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

Aber es Downloads tatsächlich die vollständige Datei.

War es hilfreich?

Lösung

Dies scheint zu funktionieren, wenn Sie Sockets verwenden:

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

Ich bin gespannt, ob es ein "ruby Weg" ist.

Andere Tipps

Dies ist ein alter Thread, aber es ist immer noch eine Frage, die meist unbeantwortet nach meinen Recherchen scheint. Hier ist eine Lösung, die ich kam mit von Affen-Patching Net :: HTTP etwas:

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

Die Rettung fängt den IOError, die ausgelöst wird, wenn Sie rufen HTTP.finish vorzeitig.

Zu Ihrer Information, die Buchse innerhalb des HTTPResponse Objekts ist kein echtes IO Objekt (es ist eine interne Klasse genannt BufferedIO), aber es ist ziemlich leicht zu Affen-Patch, der auch die IO Methoden nachzuahmen Sie benötigen. Zum Beispiel habe ich eine andere Bibliothek wurde unter Verwendung (exifr) benötigt, um die readchar Methode, die hinzuzufügen war einfach:

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

Check out „ openURI gibt zwei verschiedene Objekte “. Sie könnten die Methoden dort zu missbrauchen der Lage sein, den Download zu unterbrechen / wirft den Rest des Ergebnisses nach einer voreingestellten Grenze entfernt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top