113

I know there are libs in other languages that can take a string that contains either a path to a local file or a url and open it as a readable IO stream.

Is there an easy way to do this in ruby?

jam
  • 3,640
  • 5
  • 34
  • 50
csexton
  • 24,061
  • 15
  • 54
  • 57

1 Answers1

243

open-uri is part of the standard Ruby library, and it will redefine the behavior of open so that you can open a url, as well as a local file. It returns a File object, so you should be able to call methods like read and 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
  • 14,578
  • 6
  • 39
  • 39
  • 2
    Is there a way to return a file object like you did here from an ActionMailer attachment? – AnApprentice Dec 06 '10 at 00:03
  • 9
    Know this is a bit old now, but you can also do: `content = open("http://example.com").read` – Automatico Feb 15 '14 at 18:30
  • 7
    You can, but doing it outside the closure like that will keep the file descriptor open. This may be a problem for some usages. – Aaron Hinni Feb 17 '14 at 03:57
  • 23
    note that `open-uri` will not **stream** a file, so you can't read a first 4k of it. `open-uri` will read a **whole** file to memory at moment of opening. – zed_0xff May 15 '14 at 19:57
  • 14
    `URI.parse('http://www.stackoverflow.com').open { |f| f.read }` If you looking for a way to insure it does not call `Kernal.open`. Also gets around rubocop security rules. – User128848244 Oct 03 '18 at 19:05
  • `open-uri` isn't needed with Ruby 2.7.1. I don't know for the other versions. – Vinccool96 May 13 '22 at 13:21