Rails api active_storage

Есть ли способ создавать варианты изображений при загрузке и сохранять варианты, а не все изображение.

Например. пользователь загружает изображение размером 1000x1000, когда я получаю эту загрузку в рельсах, я хочу создать 3 варианта, 100x100, 300x300 и 600x600 и сохранить их в S3, а затем получить их, выполнив что-то вроде post.image.thumbnail

Кажется глупым, что каждый раз, когда изображение является запросом, я должен получить полноразмерное изображение из s3 и обработать его на лету, чтобы предоставить его пользователю.


person Brad    schedule 01.11.2018    source источник


Ответы (1)


Я думаю вы ищете Minimagick

добавьте это в свой гемфайл

gem 'mini_magick'

а затем вы можете использовать методы minimagick для преобразования изображения

<%= image_tag user.avatar.variant(resize: "100x100") %>

вот документация по этому поводу

person xploshioOn    schedule 01.11.2018
comment
Я использую Minimagic, но он все равно загружает исходный файл, а затем обрабатывает его, чтобы изменить размер по запросу. Я хочу изменить его размер перед сохранением на S3. поэтому я могу загрузить изображение, а в s3 я храню, возможно, большой палец размером 100x100 и изображение 600x600. поэтому мне не нужно обрабатывать его каждый раз, когда он запрашивается. - person Brad; 01.11.2018
comment
Вам не нужно обрабатывать это каждый раз. Если я не ошибаюсь, при первом запросе он создает файл, а во второй раз просто запрашивает созданный ранее. - person xploshioOn; 01.11.2018
comment
но не истекает ли срок действия этого файла? или это просто истекает срок действия URL-адреса? - person Brad; 01.11.2018
comment
это просто URL-адрес, который вам нужно вызвать ранее, чтобы создать вариант и загрузить его в службу, а затем, когда вы вызовете его, как указано выше, он просто запросит URL-адрес. прочтите здесь документацию к варианту, чтобы быть более понятным. api.rubyonrails.org/classes/ActiveStorage/Variant.html - person xploshioOn; 01.11.2018
comment
приятель, ты мне очень помог. Большое спасибо! - person Brad; 01.11.2018