Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to validate file content type to pdf, word, excel, and plain text for paperclip?

In my model:

 has_attached_file :uploaded_file,  
                      :url => "/policy_documents/get/:id",  
                      :path => "/public/policy_documents/:id/:basename.:extension" 

    validates_attachment_size :uploaded_file, :less_than => 10.megabytes    
    validates_attachment_presence :uploaded_file 
     validates_attachment_content_type :uploaded_file, :content_type =>['application/pdf', 'application/xlsx'],
                                                       :message => ', Only PDF, EXCEL, WORD or TEXT files are allowed. '

And after this, it can upload only PDF documents, not excel or word or text docs. Please help me where I am missing!

like image 248
Ravindra Avatar asked Jan 11 '12 11:01

Ravindra


2 Answers

I don't know if you have solved this for yourself but you are missing MIME types for the documents you want to handle try changing :content_type to:

:content_type => ["application/pdf","application/vnd.ms-excel",     
             "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
             "application/msword", 
             "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
             "text/plain"]

Or use a custom validation

validate :correct_content_type, :message => ", Only PDF, EXCEL, WORD or TEXT files are allowed."


def correct_content_type 
  acceptable_types = ["application/pdf","application/vnd.ms-excel",     
             "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
             "application/msword", 
             "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
             "text/plain"]
  acceptable_types.include? uploaded_file.content_type.chomp
end
like image 149
engineersmnky Avatar answered Nov 16 '22 08:11

engineersmnky


This is actually dependent on your servers 'file' command. What that command returns to you is what you need to be accepting in the paperclip validations.

For example my Debian server returns "application/msword" for an xls file. And for an xlsx file it gives "application/zip".

I currently have these to accept xls and xlsx files.

validates_attachment_content_type :file, :content_type => %w(application/zip application/msword application/vnd.ms-office application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
like image 22
Mika Avatar answered Nov 16 '22 09:11

Mika