web-dev-qa-db-fra.com

Ouvrir un IO flux depuis un fichier local ou une URL

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

Y at-il un moyen facile de faire cela en rubis?

98
csexton

open-uri fait partie de la bibliothèque Ruby standard et redéfinira le comportement de open afin que vous puissiez ouvrir une URL, ainsi qu'un fichier local. Il retourne un objet File, vous devriez donc pouvoir appeler des méthodes telles que read et readlines.

require 'open-uri'
file_contents = open('local-file.txt') { |f| f.read }
web_contents  = open('http://www.stackoverflow.com') {|f| f.read }
210
Aaron Hinni

Pour url, vous voudrez peut-être rest-client , à partir de son document 

Si vous souhaitez diffuser les données de la réponse dans un fichier tel quel, plutôt que entièrement en mémoire, vous pouvez également passer RestClient :: Request.execute un paramètre: block_response à lequel vous transmettez un bloc/proc Objet Net :: HTTPResponse non modifié de Net :: HTTP, que vous pouvez utiliser pour diffuser directement dans un fichier à la réception de chaque bloc.

File.open('/some/output/file', 'w') {|f|
  block = proc { |response|
    response.read_body do |chunk|
      f.write chunk
    end
  }
  RestClient::Request.execute(method: :get,
                              url: 'http://example.com/some/really/big/file.img',
                              block_response: block)
}
0
fangxing