ActiveStorage - получить размеры изображения после загрузки - PullRequest
0 голосов
/ 08 февраля 2020

Я использую Rails + ActiveStorage для загрузки файлов изображений и хотел бы сохранить ширину и высоту в базе данных после загрузки. Тем не менее, у меня возникают проблемы с поиском каких-либо примеров этого где-либо.

Это то, что я собрал в различных документах API, но в итоге получаю эту ошибку: private method 'open' called for #<String:0x00007f9480610118>. Замена blob на image.file заставляет рельсы регистрировать «Пропуск анализа изображения, поскольку ImageMagick не поддерживает файл» (https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/analyzer/image_analyzer.rb#L39).

Код:

class Image < ApplicationRecord
  after_commit { |image| set_dimensions image }

  has_one_attached :file

  def set_dimensions(image)
    if (image.file.attached?)
      blob = image.file.download

      # error: private method `open' called for #<String:0x00007f9480610118>
      meta = ActiveStorage::Analyzer::ImageAnalyzer.new(blob).metadata
    end
  end
end

Этот подход также проблематичен c, поскольку after_commit также вызывается при уничтожении.

TLDR: Существует ли "правильный" способ получения метаданных изображения сразу после загрузки

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Отвечая на собственный вопрос: мое оригинальное решение было близко, но требовалось установить ImageMagick (не было, и сообщения об ошибках не указывали на это). Это был мой последний код:

class Image < ApplicationRecord
  attr_accessor :skip_set_dimensions
  after_commit ({unless: :skip_set_dimensions}) { |image| set_dimensions image }

  has_one_attached :file

  def set_dimensions(image)
    if (Image.exists?(image.id))
      if (image.file.attached?)
        meta = ActiveStorage::Analyzer::ImageAnalyzer.new(image.file).metadata

        image.width = meta[:width]
        image.height = meta[:height]
      else
        image.width = 0
        image.height = 0
      end

      image.skip_set_dimensions = true
      image.save!
    end
  end
end

Я также использовал эту технику , чтобы пропустить обратный вызов на save!, предотвращая бесконечное l oop.

0 голосов
/ 10 февраля 2020

Я думаю, что вы можете получить измерение от javascript до обновления, а затем отправить эти данные в контроллер. Вы можете проверить это: Проверьте ширину и высоту изображения перед загрузкой с помощью Javascript

...