Я извлекаю изображения с открытым uri с удаленного сайта и сохраняю их на своем локальном сервере в моем приложении Ruby on Rails. Большинство изображений были показаны без проблем, но некоторые изображения просто не отображались.
После очень долгого отладочного сеанса я наконец узнал (спасибо этот блогпост), что причина этого в том, что class Buffer
в open-uri-libary обрабатывает файлы размером менее 10 КБ в качестве IO-объектов вместо tempfiles.
Мне удалось обойти эту проблему, выполнив ответ от Micah Winkelspecht на qaru.site/info/212624/..., где я поместил следующий код внутри файла в мои инициализаторы:
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?
Так как приведенный выше код практически полностью сбрасывает это поведение для всего моего приложения, я просто хочу убедиться, что я ничего не нарушаю.