Как изменить размер изображений перед загрузкой с помощью Active Storage (связано с AWS)

Я пытаюсь использовать Active Storage с Amazon Web Services вместо Carrierwave и Cloudinary.

С Carrierwave у меня были некоторые функции, которые позволяют изменять размер изображений перед загрузкой через UploaderController.

Но как это сделать с Active Storage?

Я пробую это:

Gemfile:

gem 'aws-sdk-s3', require: false
gem 'image_processing', '~> 1.2'
gem 'mini_magick', '~>4.9'

item.rb

class Item < ApplicationRecord
    has_one_attached :photo
end

На мой взгляд, у меня есть форма:

<%= f.input :photo, input_html: { accept: ('image') } %>

Я получаю этот объект как фото:

#<ActiveStorage::Attached::One:0x00005641d296e1b8 @name = "photo", @record=#<Item id: nil, name: "test0941", verbe: "To Lend", collection_id: nil, created_at: nil, updated_at: nil, price_cents: 0, description: "", category_id: 78, photo: nil>, @dependent=:purge_later>

И в моем контроллере:

@item = Item.new(item_params)
@item.photo.combine_options do |b|
    b.resize "250x200>"
end

Я не могу изменить размер фотографии методами MiniMagick gem.

Есть ли у кого-нибудь идеи для этого?

Спасибо за вашу помощь, Тибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
3 743
2

Ответы 2

Если params [: item] [: photo] - это параметр из вашего сообщения, вы можете добавить

  image = MiniMagick::Image.new(params[:item][:photo].tempfile.path)
  image.resize "250x200>"

Это работает, но в моем случае мне пришлось удалить: photo из item_params, применить описанную выше логику, а затем прикрепить фотографию с помощью @ item.photo.attach (params [: item] [: photo]).

Vorpulus Lyphane 20.07.2020 13:57

Мне нужна была контекстная информация, чтобы это работало. Эти две строки должны быть в контроллере, в действии создания и / или обновления. Сначала определите свой объект как обычно, например @obj = Obj.new(params[:id]), если это действие create. Затем добавьте две строчки в этот ответ. Если в вашей модели есть has_many_attached, вам нужно пройти через params[:object][:attachment] или что-то еще, что у вас есть. Наконец просто сохраните объект!

Jussi Hirvi 16.11.2021 04:10

У Active Storage есть решение вашей проблемы. Вам не нужно изменять размер изображений в вашем контроллере, вы можете просто использовать его как item.photo.variant (resize: '100x100') в вашем файле просмотра. Active Storage создаст новые варианты образов, как по волшебству.

Вот документация по активному хранилищу.

https://edgeguides.rubyonrails.org/active_storage_overview.html

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

Vinícius Alonso 02.03.2020 00:03

Другие вопросы по теме