-
-
Save carlosipe/5465086 to your computer and use it in GitHub Desktop.
| # encoding: utf-8 | |
| class ImageUploader < CarrierWave::Uploader::Base | |
| include CarrierWave::MiniMagick | |
| storage :file | |
| # storage :fog | |
| # Process files as they are uploaded (if width >1024): | |
| process :resize_to_limit =>[1024, 10000] | |
| def thumb(size) | |
| return default_url if url == default_url | |
| uploader = Class.new(self.class) | |
| uploader.version_names = [size] | |
| img = uploader.new(model, mounted_as) | |
| img.retrieve_from_store!(identifier) | |
| cached = File.join(CarrierWave.root, img.url) | |
| unless File.exist?(cached) | |
| img.cache!(self) | |
| size = size.split('x').map(&:to_i) | |
| resizer = case size | |
| when /[!#]/ then :resize_to_fit | |
| # add more like when />/ then ... | |
| else :resize_to_fill | |
| end | |
| img.send(resizer, *size) | |
| img.store! | |
| #puts 'RESIZING' | |
| end | |
| img | |
| end | |
| def store_dir | |
| "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" | |
| end | |
| def default_url | |
| "/assets/defaults/#{model.class.to_s.underscore}.png" #[version_name, "esparrago.jpg"].compact.join('_') | |
| end | |
| # def extension_white_list | |
| # %w(jpg jpeg gif png) | |
| # end | |
| end |
Actually, I think it's a bad idea to return a default_url, because the choice of using a default image normally belongs to the view domain, not to the model (or uploader class).
I should add a method "fallback" but still be able to receive a nil when trying to do image_tag p.picture.
This two helpers might be useful:
def img_w_fallback(p)
image_tag( p.nil? ? p.fallback : p)
end
def thumb_w_fallback(p, size)
image_tag( p.nil? p.fallback.thumb(size) ? p.thumb(size)
end
I still need a way to make thumbs of default, but I don't want to serve it transparently, but letting the choice to the view helper.
Btw, I should serve the files over a CDN, or at least a cookieless domain
Another idea: resizing by url (example, to offer an api or to work easily on javascript)
ResizerController
def index
model, id, mounted_as, operation, args = params[:url].split '/'
Class.new(model.constantize).find(id).send(mounted_as, *operation, args) || raise 404
end
//If the file already exists, nginx won't call Rails, if find fails, ActiveRecord raises an exception that produces 404, if the result of the operation is nil, I raise a 404, if it's not nil is an image_url
Controller should validate acceptable operations and args (to stop DDOS), it can also require a token.
TODO: