Abra um fluxo IO de um arquivo local ou url

104

Eu sei que existem libs em outras línguas que podem pegar uma string que contém um caminho para um arquivo local ou um url e abri-lo como um fluxo IO legível.

Existe uma maneira fácil de fazer isso em rubi?

csexton
fonte

Respostas:

224

open-uri faz parte da biblioteca Ruby padrão e redefinirá o comportamento de openpara que você possa abrir uma url, bem como um arquivo local. Ele retorna um Fileobjeto, então você deve ser capaz de chamar métodos como reade 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
fonte
2
Existe uma maneira de retornar um objeto de arquivo como você fez aqui a partir de um anexo do ActionMailer?
AnApprentice
9
Saiba que isso é um pouco antigo agora, mas você também pode fazer:content = open("http://example.com").read
Automatico
6
Você pode, mas fazê-lo fora do encerramento manterá o descritor de arquivo aberto. Isso pode ser um problema para alguns usos.
Aaron Hinni de
19
note que open-urinão irá transmitir um arquivo, então você não pode ler os primeiros 4k dele. open-urilerá um arquivo inteiro na memória no momento da abertura.
zed_0xff
3
URI.parse('http://www.stackoverflow.com').open { |f| f.read }Se você está procurando uma forma de segurar não ligue Kernal.open. Também contorna as regras de segurança do Rubocop.
newdark-it