Open an IO stream from a local file or url
Asked Answered
F

1

115

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?

Fantasm answered 4/11, 2008 at 21:36 Comment(0)
S
244

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 }
Sulph answered 5/11, 2008 at 3:0 Comment(7)
Is there a way to return a file object like you did here from an ActionMailer attachment?Bridgeport
Know this is a bit old now, but you can also do: content = open("http://example.com").readRibeiro
You can, but doing it outside the closure like that will keep the file descriptor open. This may be a problem for some usages.Sulph
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.Teerell
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.Cyrillus
open-uri isn't needed with Ruby 2.7.1. I don't know for the other versions.Atween
Your first open call now throws: "(irb):2:in `initialize': No such file or directory @ rb_sysopen - stackoverflow.com (Errno::ENOENT)"Wholesale

© 2022 - 2024 — McMap. All rights reserved.