如何使用carrierwave,mini magick和mongoid验证上传时的图像宽度和高度?

时间:2012-04-03 16:31:32

标签: ruby-on-rails imagemagick mongoid carrierwave minimagick

我需要检查用户上传到我网站的图片是否具有200px的准确宽度和300px的高度。如果他们没有这些维度,则不应将其保存在数据库中。

我已经尝试过使用mini-magick多年,并经历了大量的教程,Stack Overflow上的帖子等等,但我找不到这样做的功能方法。

我在运行mongoid的mongoDB上使用ruby 1.9.3和rails 3.2.2。

真的希望你能把我放在正确的方向上。

我的图像模型如下所示:

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

我的carrierwave模型看起来像这样:

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 个答案:

答案 0 :(得分:4)

我最终在UserUploader和User类中做了一些RMagick:

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