Проверьте размер изображения в загрузчике на носителе - PullRequest
20 голосов
/ 23 сентября 2011

Все загрузки должны быть не менее 150x150 пикселей.Как проверить это с Carrierwave?

Ответы [ 4 ]

18 голосов
/ 03 июня 2012

Почему бы не использовать MiniMagick?Модифицированный ответ DelPiero:

validate :validate_minimum_image_size

def validate_minimum_image_size
  image = MiniMagick::Image.open(picture.path)
  unless image[:width] > 400 && image[:height] > 400
    errors.add :image, "should be 400x400px minimum!" 
  end
end
13 голосов
/ 23 января 2013

Я сделал немного более полный валидатор на основе ответа @ skalee

class ImageSizeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value.blank?

      image = MiniMagick::Image.open(value.path)
      checks = [
        { :option => :width, 
          :field => :width, 
          :function => :'==',
          :message =>"Image width must be %d px."},
        { :option => :height, 
          :field => :height, 
          :function => :'==',
          :message =>"Image height must be %d px."},
        { :option => :max_width, 
          :field => :width, 
          :function => :'<=',
          :message =>"Image width must be at most %d px."},
        { :option => :max_height, 
          :field => :height, 
          :function => :'<=',
          :message =>"Image height must be at most %d px."},
        { :option => :min_width, 
          :field => :width, 
          :function => :'>=',
          :message =>"Image width must be at least %d px."},
        { :option => :min_height, 
          :field => :height, 
          :function => :'>=',
          :message =>"Image height must be at least %d px."},
      ]

      checks.each do |p|
        if options.has_key?(p[:option]) and 
          !image[p[:field]].send(p[:function], options[p[:option]])

          record.errors[attribute] << p[:message] % options[p[:option]]
        end
      end

    end
  end
end

Используйте его как validates :image, :image_size => {:min_width=>400, :min_height => 400}.

8 голосов
/ 28 февраля 2012

Меня удивило, насколько сложно было найти четкий способ проверки ширины и высоты изображения с помощью CarrierWave. Приведенное выше решение @ Кира является правильным, но я хотел сделать шаг вперед, объяснив, что он сделал, и незначительные изменения, которые я сделал.

Если вы посмотрите на его суть https://gist.github.com/1239078,, ответ лежит в обратном вызове before :cache, который он имеет в классе Uploader. Волшебная линия

model.avatar_upload_width, model.avatar_upload_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }

в его случае, avatar_upload_width & avatar_upload_height являются атрибутами его пользовательской модели. Я не хотел иметь для хранения ширины и высоты в базе данных, поэтому в моей модели я сказал:

attr_accessor :image_width, :image_height

Помните, вы можете использовать attr_accessor для атрибутов, которые вы хотите иметь под рукой, когда возитесь с записью, но просто не хотите сохранять их в БД. Так что моя магическая линия фактически превратилась в

model.image_width, model.image_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }

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

validate :validate_minimum_image_size

А затем под ним определите свой пользовательский метод проверки, такой же, как в gist

# custom validation for image width & height minimum dimensions
def validate_minimum_image_size
    if self.image_width < 400 && self.image_height < 400
        errors.add :image, "should be 400x400px minimum!" 
    end
end
6 голосов
/ 07 декабря 2015

Я только что создал собственный валидатор, который стремится быть более дружественным к синтаксису Rails 4+.
Я взял идеи из ответов других в этой теме.
Вот суть: https://gist.github.com/lou/2881f1aa183078687f1e

И вы можете использовать его так:

validates :image, image_size: { width: { min: 1024 }, height: { in: 200..500 } }

В данном конкретном случае должно быть:

validates :image, image_size: { width: 150, height: 150 }
...