Dies ist ein alter Thread, aber die Frage, wie man nur einen Teil einer Datei via HTTP in Ruby lesen kann, ist nach meinen Recherchen immer noch eine weitgehend unbeantwortete. Hier ist eine Lösung, die ich mit von Affen-Patching Net kam :: HTTP ein bisschen:
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);
# be sure to call finish before exiting the block
http.finish
end
end
rescue IOError
# ignore
end
Die Rettung fängt den IOError, die ausgelöst wird, wenn Sie HTTP.finish vorzeitig rufen.
FYI, die Buchse innerhalb des HTTPResponse
Objekts ist kein echtes IO
Objekt (es ist eine interne Klasse BufferedIO
genannt), 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 leicht zu:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
dies ist keine Antwort. Sie können sich nicht vorstellen, wie etwas notwendig/nützlich/wünschenswert sein könnte, weil Sie es persönlich noch nicht kennengelernt haben. Wen kümmert es, warum er muss? Wen kümmert es, wenn Sie ein Ende der Frage haben? Die Frage ist "Wie lese ich nur x Anzahl der Bytes des Körpers mit Net :: HTTP? ". Weißt du wie? Wenn nicht, warum verschwendest du die Bandbreite von jedem? –