2013-01-24 4 views
1

Je voudrais permettre aux utilisateurs de télécharger des fichiers .jpg mais seulement si elles sont en fait .jpg (par exemple, cat.gif renommé cat.jpg serait pas travailcarrierwave: reject .gif .jpg renommé

Actuellement dans mon Carrierwave. ImageUploader.rb Je:

include CarrierWave::RMagick 
include CarrierWave::MimeTypes 
process :set_content_type 
def extension_white_list 
    %w(jpg jpeg png) 
end 

et dans mon dossier de test Rspec je le tester trois façons:

# Works 
describe "with invalid mime type and invalid extension" do 
    before do 
    image.image = File.open(File.join(Rails.root, 'spec', 'support', 'image', 'images', 'executable.jpg')) # this is a .exe renamed to .jpg 
    end 
    it { image.should_not be_valid } 
end 

# Works 
describe "with invalid mime type and invalid extension" do 
    before do 
    image.image = File.open(File.join(Rails.root, 'spec', 'support', 'image', 'images', 'test_gif.gif')) # this is a .gif 
    end 
    it { should_not be_valid } 
end 

# Doesn't work 
describe "with invalid mime type and valid extension" do 
    before do 
    image.image = File.open(File.join(Rails.root, 'spec', 'support', 'image', 'images', 'test_gif.jpg')) # this is a .gif renamed to .jpg 
    end 
    it { image.should_not be_valid } 
end 

Les tests passent pour les deux premiers, mais échouent sur le second. Je ne sais pas pourquoi, puisque je n'ai pas gif sur la liste blanche et je vérifie les types mime.

Des suggestions?

(Conversion gifs à jpgs est ma sauvegarde, mais je préférerais simplement les nier.)

+0

Je pense que extension_white_list vérifie que l'extension. Je pense que vous devez vérifier l'attribut content_type: https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Store-the-uploaded-file-size-and-content-type – micapam

+0

le second " décrivez "est" il ne devrait pas être "valide" et d'autres sont "ça {image. ne devrait pas ..." êtes-vous sûr que le deuxième "c'est" le sujet? – kukrt

+0

@micapam en incluant MimeTypes J'étais sous l'impression que je vérifiais content_type: https://github.com/jnicklas/carrierwave#setting-the-content-type – pseudosudo

Répondre

0

je suis tombé sur ce même problème et a dû passer outre la méthode set_content_type par défaut pour mon Uploader. Cela suppose que vous avez Rmagick gem dans votre Gemfile, de sorte que vous pouvez obtenir le type mime correct de lire l'image, plutôt que de faire une meilleure estimation. Remarque: Ceci est particulièrement utile si l'image est utilisée par Prawn qui ne prend en charge que les images JPG et PNG.

Uploader Classe:

process :set_content_type 

def set_content_type #Note we are overriding the default set_content_type_method for this uploader 
    real_content_type = Magick::Image::read(file.path).first.mime_type 
    if file.respond_to?(:content_type=) 
    file.content_type = real_content_type 
    else 
    file.instance_variable_set(:@content_type, real_content_type) 
    end 
end 

image Modèle:

class Image < ActiveRecord::Base 
    mount_uploader :image, ImageUploader 

    validates_presence_of :image 
    validate :validate_content_type_correctly 

    before_validation :update_image_attributes 

private 
    def update_image_attributes 
    if image.present? && image_changed? 
     self.content_type = image.file.content_type 
    end 
    end 

    def validate_content_type_correctly 
    if not ['image/png', 'image/jpg'].include?(content_type) 
     errors.add_to_base "Image format is not a valid JPEG or PNG." 
     return false 
    else 
     return true 
    end 
    end 
end