Wie über HTTP nur Stück großer Datei mit Ruby zum Download
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.
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.