Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paperclip's content_type is invalid according to app, but isn't

I'm new to Paperclip and it all seemed to work pretty fast. I'm trying to get the user to only upload PNG's or JPG's though, and although I'm uploading a JPG and my content_type validates for JPG it says it's invalid nonetheless.

I've tried removing the PNG content_type, to no avail.

I've tried using has_attached_file aswell, but it seems to ignore the :content_type and stuff. Because if I upload a JPG with :content_type => "image/png" only; It doesn t give an error.

Any suggestions?

    validates_attachment :avatar, :styles => { 
                                    :medium => "300x300", 
                                    :thumb => "100x100" 
                                }, :content_type => { 
                                    :content_type => "image/jpg", 
                                    :content_type => "image/png"
                                },
                                :size => { :in => 0..1.megabytes }

Oh, and while I'm at it; I want to get my thumb and medium to the fixed width. So no scaling like 100x80 but just 100x100 either way. How can I do that?

like image 986
CaptainCarl Avatar asked Feb 14 '23 17:02

CaptainCarl


2 Answers

It seems you're trying to use some Paperclip validation, which you could look at here: Paperclip - Validate File Type but not Presence

According to that answer, you could use this:

validates_attachment_content_type :sound, :content_type => ['audio/mp3', 'application/x-mp3'], :if => :sound_attached?

An alternative is to use lambda to check to see whether you're dealing with a specific content type. Here's an example from one of our live apps:

   has_attached_file :attachment,
            styles:          lambda { |a| a.instance.is_image? ? {:small => "x200>", :medium => "x300>", :large => "x400>"}  : {:thumb => { :geometry => "100x100#", :format => 'jpg', :time => 10}, :medium => { :geometry => "300x300#", :format => 'jpg', :time => 10}}}

    def is_image?
            attachment.instance.attachment_content_type =~ %r(image)
    end

Lambda is only really a way to gauge whether the content-type is what you need (I.E you only allow JPG images). In order to validate the presence of an image (rather than a video), you'd need to validates_attachment_content_type

like image 113
Richard Peck Avatar answered Feb 17 '23 21:02

Richard Peck


I ran into the same issue tonight, and it turned out I needed image/jpeg and image/jpg

 validates_attachment :avatar, :styles => { 
                                    :medium => "300x300", 
                                    :thumb => "100x100" 
                                }, :content_type => { 
                                    :content_type => "image/jpg",
                                    :content_type => "image/jpeg", 
                                    :content_type => "image/png"
                                },
                                :size => { :in => 0..1.megabytes }

It worked when just trying /^image/ but I like being specific.

like image 42
upisdown Avatar answered Feb 17 '23 21:02

upisdown