Почему OpenURI обрабатывает файлы размером менее 10 КБ как StringIO?

Я загружаю изображения с открытым -uri с удаленного веб-сайта и сохраняю их на своем локальном сервере в моем приложении Ruby on Rails. Большинство изображений показывались без проблем, но некоторые изображения просто не отображались.

После очень долгого сеанса отладки -я наконец узнал (благодаря этому сообщению в блоге ), что причина этого в том, что class Bufferв открытом -uri -библиотека обрабатывает файлы размером менее 10 КБ как объекты ввода-вывода -, а не как временные файлы.

Мне удалось обойти эту проблему, следуя ответу Мики Винкельспехта на этот вопрос StackOverflow , где я поместил следующий код в файл в моих инициализаторах:

require 'open-uri'
# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0

Пока это работает, как и ожидалось, но мне все время интересно, почему они вообще поместили этот код в библиотеку? Кто-нибудь знает конкретную причину,Почему файлы размером менее 10 КБ обрабатываются как StringIO?

Поскольку вышеприведенный код фактически сбрасывает это поведение глобально для всего моего приложения, я просто хочу убедиться, что ничего не нарушаю.

22
задан Community 23 May 2017 в 12:09
поделиться