Извлечение размеров изображения в фоновом режиме с помощью Shrine
Я установил прямые загрузки на S3 с помощью Shrine. Это прекрасно работает. Среди прочего, у меня включены следующие плагины:
Shrine.plugin :backgrounding
Shrine.plugin :store_dimensions
Shrine.plugin :restore_cached_data
Поправьте меня, если я ошибаюсь, но извлечение размеров изображения происходит синхронно. Если я позволю пользователю загружать изображения через Uppy, а затем сохраню их все, это займет много времени.
Я хотел бы выполнить асинхронное извлечение размеров изображения - мне не нужны размеры, доступные для кэшированного файла. Если возможно, я бы хотел сделать это в фоновом режиме, когда файл будет продвигаться в хранилище. Есть ли способ сделать это?
1 ответ
Я получил это на работу, используя :refresh_metadata
плагин, вместо :restore_cached_data
который я использовал изначально. Спасибо Янко за то, что он указал мне правильное направление.
Чтение исходного кода дало некоторые полезные идеи. :store_dimensions
Плагин сам по себе не извлекает измерения - он добавляет ширину и высоту к хешу метаданных, поэтому, когда базовый класс Shrine запрашивает метаданные, они также извлекаются.
Используя :restore_cached_data
это делалось на каждом задании. :restore_cached_data
использования :refresh_metadata
внутренне, поэтому мы можем использовать это знание, чтобы вызывать его только тогда, когда файл продвигается в хранилище.
я имею :backgrounding
а также :store_dimensions
установить в инициализаторе, чтобы финальный загрузчик можно было упростить до этого:
class ImageUploader < Shrine
plugin :refresh_metadata
plugin :processing
process(:store) do |io, context|
io.refresh_metadata!(context)
io
end
end
Таким образом, сохранение данных, которые мы получаем из Uppy, происходит очень быстро, и мы позволяем фоновому заданию извлекать измерения при продвижении файла в хранилище, чтобы их можно было использовать позже.
Наконец, если у вас есть вопросы, касающиеся Shrine, я настоятельно рекомендую его специальную группу Google. Престижность Янко не только за создание удивительного программного обеспечения (серьезно, прочитайте источник), но и за его приверженность поддержке сообщества.