From 528e8a274988f2fab5ceda3a5b003ce8d38c7c21 Mon Sep 17 00:00:00 2001 From: Gautam Punhani Date: Wed, 13 Mar 2013 21:46:29 +0530 Subject: [PATCH] Added errors on file size --- lib/carrierwave/locale/en.yml | 2 ++ lib/carrierwave/uploader.rb | 2 ++ lib/carrierwave/uploader/file_size.rb | 43 +++++++++++++++++++++++ spec/uploader/callback_spec.rb | 6 ++-- spec/uploader/file_size_spec.rb | 49 +++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 lib/carrierwave/uploader/file_size.rb create mode 100644 spec/uploader/file_size_spec.rb diff --git a/lib/carrierwave/locale/en.yml b/lib/carrierwave/locale/en.yml index ecf6c9e70..70edafaee 100644 --- a/lib/carrierwave/locale/en.yml +++ b/lib/carrierwave/locale/en.yml @@ -9,3 +9,5 @@ en: rmagick_processing_error: "Failed to manipulate with rmagick, maybe it is not an image? Original Error: %{e}" mime_types_processing_error: "Failed to process file with MIME::Types, maybe not valid content-type? Original Error: %{e}" mini_magick_processing_error: "Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: %{e}" + min_size_error: "File size should be greater than %{min_size}" + max_size_error: "File size should be less than %{max_size}" diff --git a/lib/carrierwave/uploader.rb b/lib/carrierwave/uploader.rb index 9e6808a40..d1f90a982 100644 --- a/lib/carrierwave/uploader.rb +++ b/lib/carrierwave/uploader.rb @@ -11,6 +11,7 @@ require "carrierwave/uploader/remove" require "carrierwave/uploader/extension_whitelist" require "carrierwave/uploader/extension_blacklist" +require "carrierwave/uploader/file_size" require "carrierwave/uploader/processing" require "carrierwave/uploader/versions" require "carrierwave/uploader/default_url" @@ -53,6 +54,7 @@ class Base include CarrierWave::Uploader::Remove include CarrierWave::Uploader::ExtensionWhitelist include CarrierWave::Uploader::ExtensionBlacklist + include CarrierWave::Uploader::FileSize include CarrierWave::Uploader::Processing include CarrierWave::Uploader::Versions include CarrierWave::Uploader::DefaultUrl diff --git a/lib/carrierwave/uploader/file_size.rb b/lib/carrierwave/uploader/file_size.rb new file mode 100644 index 000000000..b0a4fc85e --- /dev/null +++ b/lib/carrierwave/uploader/file_size.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 + +module CarrierWave + module Uploader + module FileSize + extend ActiveSupport::Concern + + included do + before :cache, :check_size! + end + + ## + # Override this method in your uploader to provide a Range of Size which + # are allowed to be uploaded. + # === Returns + # + # [NilClass, Range] a size range which are permitted to be uploaded + # + # === Examples + # + # def size_range + # 3256....5748 + # end + # + def size_range; end + + private + + def check_size!(new_file) + size = new_file.size + expected_size_range = size_range + if expected_size_range.is_a?(::Range) + if size < expected_size_range.min + raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.min_size_error", :min_size => expected_size_range.min) + elsif size > expected_size_range.max + raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.max_size_error", :max_size => expected_size_range.max) + end + end + end + + end # FileSize + end # Uploader +end # CarrierWave diff --git a/spec/uploader/callback_spec.rb b/spec/uploader/callback_spec.rb index 4e5843387..7166bcb03 100644 --- a/spec/uploader/callback_spec.rb +++ b/spec/uploader/callback_spec.rb @@ -8,16 +8,16 @@ @uploader_class_1 = Class.new(CarrierWave::Uploader::Base) # First Uploader only has default before-callback - @uploader_class_1._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!] + @uploader_class_1._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!, :check_size!] @uploader_class_2 = Class.new(CarrierWave::Uploader::Base) @uploader_class_2.before :cache, :before_cache_callback # Second Uploader defined with another callback - @uploader_class_2._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!, :before_cache_callback] + @uploader_class_2._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!, :check_size!, :before_cache_callback] # Make sure the first Uploader doesn't inherit the same callback - @uploader_class_1._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!] + @uploader_class_1._before_callbacks[:cache].should == [:check_whitelist!, :check_blacklist!, :check_size!] end diff --git a/spec/uploader/file_size_spec.rb b/spec/uploader/file_size_spec.rb new file mode 100644 index 000000000..11bd50430 --- /dev/null +++ b/spec/uploader/file_size_spec.rb @@ -0,0 +1,49 @@ +# encoding: utf-8 + +require 'spec_helper' + +describe CarrierWave::Uploader do + before do + @uploader_class = Class.new(CarrierWave::Uploader::Base) + @uploader = @uploader_class.new + end + + after do + FileUtils.rm_rf(public_path) + end + + describe '#cache!' do + + before do + CarrierWave.stub!(:generate_cache_id).and_return('20071201-1234-345-2255') + end + + it "should not raise an integrity error if there is no range specified" do + @uploader.stub!(:size_range).and_return(nil) + running { + @uploader.cache!(File.open(file_path('test.jpg'))) + }.should_not raise_error(CarrierWave::IntegrityError) + end + + it "should raise an integrity error if there is a size range and file has size less than minimum" do + @uploader.stub!(:size_range).and_return(2097152..4194304) + running { + @uploader.cache!(File.open(file_path('test.jpg'))) + }.should raise_error(CarrierWave::IntegrityError) + end + + it "should raise an integrity error if there is a size range and file has size more than maximum" do + @uploader.stub!(:size_range).and_return(0..10) + running { + @uploader.cache!(File.open(file_path('test.jpg'))) + }.should raise_error(CarrierWave::IntegrityError) + end + + it "should not raise an integrity error if there is a size range the file is not on it" do + @uploader.stub!(:size_range).and_return(0..50) + running { + @uploader.cache!(File.open(file_path('test.jpg'))) + }.should_not raise_error(CarrierWave::IntegrityError) + end + end +end