Открыть поток ввода-вывода из локального файла или URL-адреса
Я знаю, что на других языках есть libs, которые могут принимать строку, содержащую либо путь к локальному файлу, либо URL-адрес и открывать его как читаемый поток ввода-вывода.
Есть ли простой способ сделать это в рубине?
Ответы
Ответ 1
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 }
Ответ 2
Для 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)
}