Skip to content

Instantly share code, notes, and snippets.

@yortz
Created November 27, 2010 16:49
Show Gist options
  • Save yortz/718055 to your computer and use it in GitHub Desktop.
Save yortz/718055 to your computer and use it in GitHub Desktop.
image_uploader.rb
#config/initializers/carrierwave.rb
CarrierWave.configure do |config|
if Rails.env.production? or Rails.env.development?
config.storage :cloud_files
config.cloud_files_username = "your_username"
config.cloud_files_api_key = "your_key"
config.cloud_files_container = "test"
config.cloud_files_cdn_host = "c0012345.cdnn.cloudfiles.rackspacecloud.com"
def store_dir
"images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
else
config.storage = :file
def store_dir
"vendor/plugins/syncher/public/images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
end
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
# Include RMagick or ImageScience support
# include CarrierWave::RMagick
# include CarrierWave::ImageScience
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader
# storage :file
# storage :s3
# storage :cloud_files
# 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
# "images/#{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
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
def default_url
"/images/no_image_#{version_name}.png"
end
# Process files as they are uploaded.
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files
process :resize_to_fit => [800, 600]
process :optimize_image
process :watermark => "#{RAILS_ROOT}/public/images/neonisi-watermark.png"
version :thumb do
process :resize_to_fit => [80, 80]
process :optimize_image
end
version :medium do
process :resize_to_fit => [160, 160]
process :optimize_image
end
# 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 gif png)
end
# Override the filename of the uploaded files
def filename
return nil if @original_filename.blank?
name = model["temp_#{self.mounted_as}_name"]
name.present? ? name : renaming
end
private
def renaming
# store the image name based on random words in the item_detail title
if model.item_detail.present?
model.splitted_title ||= model.item_detail.title.split(/[^-a-zA-Z0-9]/).delete_if{ |w| w == '' or w == '-' }.map!{ |w| w + '-' }
words = model.splitted_title.sort_by { rand }
model["temp_#{self.mounted_as}_name"] = words[0..4].to_s[0..-2] + '.jpg'
else
item_detail = ItemDetail.find_by_internal_id(model.temporary_file_name)
model.splitted_title ||= item_detail.title.split(/[^-a-zA-Z0-9]/).delete_if{ |w| w == '' or w == '-' }.map!{ |w| w + '-' }
words = model.splitted_title.sort_by { rand }
model["temp_#{self.mounted_as}_name"] = words[0..4].to_s[0..-2] + '.jpg'
end
end
def watermark(path_to_file)
manipulate! do |img|
img = img.composite(MiniMagick::Image.open(path_to_file), "jpg") do |c|
c.gravity "SouthEast"
end
end
end
def optimize_image
manipulate! do |img|
img.format('JPEG')
img = img.auto_orient
img = img.quality 80
img
end
end
end
class Image < ActiveRecord::Base
has_many :images_items
has_many :items, :through => :images_items
belongs_to :item_detail
mount_uploader :name, ImageUploader, :delayed=> true
default_scope :order => "position ASC"
attr_accessor :splitted_title, :temp_name_name, :name_content_type, :name_file_name, :name_cache_name
attr_accessible :name, :remote_name_url, :name_cache, :remove_name, :item_detail_id, :position, :temporary_file_name
validates_size_of :name, :maximum => 4.megabyte, :message => I18n.t('models.images.too_big')
before_save :save_cache_column
after_save :send_store_column , :if=>:check_for_file
def save_cache_column
self.cache_name = name.cache_name
end
def send_store_column
self.send_later(:store_name!)
end
def check_for_file
self.name.filename
end
end
require 'uuid'
class ItemsController < ApplicationController
def new
@uuid = UUID.new
@temp_name = @uuid.generate(:compact).object_id
@item = Item.new
@item.build_item_detail
@item.build_dropship_item if @dropship
@item.clone_from_other_item(params[:i]) if params[:i]
@item.set_from_user(current_user)
@item.clone_from_template(params[:t]) if params[:t] and !params[:i]
5.times { @item.images.build }
end
def create
@item = Item.new(params[:item])
unless @dropship
@item.user = current_user
else
@item.dropship_item_attributes = params[:item][:dropship_item_attributes]
@item.synchronized_shop_id = params[:item][:synchronized_shop_id]
end
if @item.save
redirect_to_with(:notice, @dropship ? dropship_items_url : item_url(current_language, current_country, @item), Item.successfully_created)
else
render 'new'
end
end
end
@harshamv
Copy link

does the watermark code work with RMagick as well?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment