Ouvrez un flux IO à partir d'un fichier local ou d'une URL

104

Je sais qu'il existe des bibliothèques dans d'autres langues qui peuvent prendre une chaîne qui contient un chemin vers un fichier local ou une URL et l'ouvrir en tant que flux IO lisible.

Existe-t-il un moyen simple de le faire en rubis?

csexton
la source

Réponses:

224

open-uri fait partie de la bibliothèque Ruby standard, et il redéfinira le comportement de openafin que vous puissiez ouvrir une URL, ainsi qu'un fichier local. Il renvoie un Fileobjet, vous devriez donc pouvoir appeler des méthodes comme readet readlines.

require 'open-uri'
file_contents = open('local-file.txt') { |f| f.read }
web_contents  = open('http://www.stackoverflow.com') {|f| f.read }
Aaron Hinni
la source
2
Existe-t-il un moyen de renvoyer un objet fichier comme vous l'avez fait ici à partir d'une pièce jointe ActionMailer?
AnApprentice
9
Sachez que c'est un peu vieux maintenant, mais vous pouvez aussi faire:content = open("http://example.com").read
Automatico
6
Vous pouvez, mais le faire en dehors de la fermeture comme cela gardera le descripteur de fichier ouvert. Cela peut être un problème pour certaines utilisations.
Aaron Hinni
19
notez que open-uricela ne diffusera pas un fichier, vous ne pouvez donc pas en lire un premier 4k. open-urilira un fichier entier en mémoire au moment de l'ouverture.
zed_0xff
3
URI.parse('http://www.stackoverflow.com').open { |f| f.read }Si vous cherchez un moyen de vous assurer, il n'appelle pas Kernal.open. Contourne également les règles de sécurité de rubocop.
newdark-it