Несмотря на то, что решение Steigers является простым универсальным решением, некоторые из нас могут быть оттолкнуты его «неприятным хакерским» чувством и тем, как оно меняет поведение в глобальном масштабе. Включая другие драгоценные камни и такие, которые могут принести пользу или зависеть от этой функции OpenURI. Ofc. Вы также можете использовать вышеупомянутый подход, а затем, когда вы закончите, сбросить константу обратно к ее первоначальному значению, и из-за GIL вы можете избежать неприятностей такого рода (хотя тогда обязательно держитесь подальше от jruby и потоков!) .
В качестве альтернативы вы можете сделать что-то подобное, что в основном гарантирует, что если вы получите поток, он будет передан во временный файл:
def write_stream_to_a_temp_file(stream)
ext = begin
"."+MIME::Types[stream.meta["content-type"]].first.extensions.first
rescue #In case meta data is not available
#It seems sometimes the content-type is binary/octet-stream
#In this case we should grab the original ext name.
File.extname(stream.base_uri.path)
end
file = Tempfile.new ["temp", ext]
begin
file.binmode
file.write stream.read
ensure
file.flush rescue nil
file.close rescue nil
end
file
end
# and when you want to enforce that data must be a temp file then just...
data = write_stream_to_a_temp_file data unless data.is_a? Tempfile