Как проверить ширину и высоту изображения при загрузке с помощью carrierwave, mini magick и mongoid? - PullRequest
1 голос
/ 03 апреля 2012

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

Я пробовал целую вечность с помощью мини-магии и прошел многочисленные уроки, публикации о переполнении стека и т. Д., Но яЯ не могу найти функциональный способ сделать это.

Я использую ruby ​​1.9.3 и rails 3.2.2, на mongoDB, работающем в mongoid.

Очень надеялся, что вы меня поставитев правильном направлении.

Моя модель изображения выглядит так:

class Flow
    include Mongoid::Document
    include Mongoid::Taggable
    include Mongoid::Timestamps
    include Mongo::Voteable
    voteable self, :up => +1, :down => -1

    attr_accessible :image, :remote_image_url, :tags

    mount_uploader :image, UserUploader

    belongs_to :user

    field :shot, :type => String
    field :remote_image_url, :type => String
    field :tags, type: Array
end

А моя модель несущей волны выглядит следующим образом:

class UserUploader < CarrierWave::Uploader::Base
    include CarrierWave::MiniMagick

    storage :fog

    def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end

    def extension_white_list
        %w(jpg jpeg png gif)
    end
end

1 Ответ

4 голосов
/ 08 апреля 2012

В итоге я сделал несколько RMagick в UserUploader и в классе User:

UserUploader:

process :get_geometry
def geometry
    @geometry
end

def get_geometry
    if (@file)
        img = ::Magick::Image::read(@file.file).first
        @geometry = [ img.columns, img.rows ]
    end
end

Класс пользователя

validate :validate_minimum_image_size

def validate_minimum_image_size
    geometry = self.image.geometry
    if (! geometry.nil?)
        self.width = geometry[0]
        self.height = geometry[1]
    end
    unless (self.width == 320 && self.height == 480) || (self.width == 640 && self.height == 960)
        errors.add :base, "Naughty you... iPhone designs should be 320px x 480px or 640px x 960px." 
    end
end
...