Carrierwave image model validation on image dimensions/height/width.
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
def default_url
"/uploads/missing/#{model.class.to_s.underscore}/#{version_name}.png"
end
# for image size validation
# fetching dimensions in uploader, validating it in model
attr_reader :width, :height
before :cache, :capture_size
def capture_size(file)
if version_name.blank? # Only do this once, to the original version
if file.path.nil? # file sometimes is in memory
img = ::MiniMagick::Image::read(file.file)
@width = img[:width]
@height = img[:height]
else
@width, @height = `identify -format "%wx %h" #{file.path}`.split(/x/).map{|dim| dim.to_i }
end
end
end
# resizing uploads
process :resize_to_fill => [148, 148]
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg png)
end
end
class Banner < ActiveRecord::Base
attr_accessor :image_width, :image_height
mount_uploader :image, ImageUploader
validate :check_dimensions, :on => :create
def check_dimensions
if !image_cache.nil? && (image.width < 300 || image.height < 300)
errors.add :image, "Dimension too small."
end
end
end