Prawn PDF: как добавить изображения, загруженные с помощью Dragonfly

Мне нравится создавать PDF-файлы, которые также включают изображения, загруженные пользователем. Prawn gem работает до сих пор, а также может встраивать изображения, расположенные в файловой системе. Моя проблема в том, что я хочу включить загруженные пользователем изображения, и место хранения этих изображений, вероятно, изменится в будущем (от файловой системы до какой-то облачной службы). Я использую драгоценный камень стрекозы для обработки изображений, он использует стойку для доступа к изображениям и иногда обрабатывает их на лету.

Теперь самая простая идея не работает (с report моим объектом и spot_image моим полем изображения)

image report.spot_image

no implicit conversion of #<Class:0x007fc07ecf1110> into String

Я также пытался открыть файл через http с помощью open-uri. Это должно работать, но блокируется на моей машине разработки, я думаю, потому что сервер разработки rails является однопоточным:

image_path = report.spot_image.remote_url
image_url = "#{view.request.protocol}\#view.request.host_with_port}
             /#{image_path.sub(/^\//,"")}"

image open(image_url)  # timeout in development-mode

Вероятно, он может работать в продакшене, но даже тогда он выполняет ненужный http-запрос. Могу ли я попросить стрекозу (или стойку) напрямую для изображения? prawn использует утиную печать и нуждается в каком-то объекте, который реагирует на read и rewind как изображение.


person Meier    schedule 08.07.2015    source источник
comment
It may probably work in production, but even then it does a needless http-request - что ты имеешь в виду под ненужным? Если это удаленное изображение, то какой-то компонент должен будет сделать http-запрос, чтобы получить его для встраивания.   -  person Cody Caughlan    schedule 17.07.2015


Ответы (1)


Я нашел соответствующую документацию по обработке файлов Dragonfly. Следующее не сработало: метод report.spot_image.data возвращает данные изображения в виде строки, но prawn распознает данные как путь, а не как данные изображения. Метод tempfile стрекозы возвращает закрытый временный файл, но креветка не распознает, что может его открыть.

У меня был успех с методом file, который возвращает дескриптор открытого файла. Неясно, закрывает ли креветка этот файл. Поэтому я использовал блочный метод, чтобы убедиться, что файл закрыт:

   report.spot_image.file do |f|
       image f
   end

Это работает до сих пор. (еще не тестировалось с облачным хранилищем)

person Meier    schedule 17.07.2015