2008-11-04 5 views
85

Я знаю, что на других языках есть библиотеки, которые могут содержать строку, содержащую либо путь к локальному файлу, либо URL-адрес и открывать его как читаемый поток ввода-вывода.Открыть поток IO из локального файла или url

Есть ли простой способ сделать это в рубине?

ответ

191

open-uri является частью стандартной библиотеки Ruby, и он будет переопределять поведение open, чтобы вы могли открыть URL-адрес, а также локальный файл. Он возвращает объект File, поэтому вы должны иметь возможность вызывать методы, такие как read и readlines.

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

@This только что сделал мой день. Спасибо! – AnApprentice

+2

Есть ли способ вернуть файл-файл, как вы это делали, из приложения ActionMailer? – AnApprentice

+0

Это превосходно - спасибо. –

0

Для URL, вы можете rest-client, от его документа

Если вы хотите, чтобы поток данных из ответа на файл, как это происходит, а не полностью в памяти, вы можете также передать RestClient :: Request.execute параметр: block_response, которому вы передаете блок/proc.This-блок получает исходный немодифицированный объект Net :: HTTPResponse из Net :: HTTP, который вы можете использовать для потоковой передачи непосредственно в файл в виде каждого фрагмента получен.

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) 
}