Verify file type in Ruby

Posted: February 27th, 2010 | Author: admin | Filed under: Uncategorized | Tags: , , , , , , | No Comments »

I was unable to find anything quite like this in Google, so I had to make one.  When validating a file type, you don’t want to resort to telling your user a file is the wrong format when they think is.  If for some reason a user’s file doesn’t contain an extension, you should check the mime type as a last resort.  Linux and Mac users may often not use file extensions.  Note that if you are doing this for security reasons, you should check both the extension and mime-type instead of one or the other.

Here was my solution for checking to see if a file was a document for a Recruiting web site.  Note that you will need MIME::Types which is included by default in Ruby on Rails.

def is_document?(file)
  extensions = %w( pages pdf doc docx rtf txt odt )
  # used http://filext.com/ for mime types
  mimetypes = %w( application/pdf application/x-pdf application/acrobat applications/vnd.pdf text/pdf text/x-pdf
                  application/doc appl/text application/vnd.msword application/vnd.ms-word application/winword application/word application/x-msw6 application/x-msword
                  application/vnd.openxmlformats-officedocument.wordprocessingml.document
                  application/rtf application/x-rtf text/rtf text/richtext application/msword application/x-soffice
                  text/plain application/txt browser/internal text/anytext widetext/plain widetext/paragraph
                  application/vnd.oasis.opendocument.text application/x-vnd.oasis.opendocument.text
                  application/x-iwork-pages-sffpages )
  if file.include?('.')
    return extensions.include? file[ file.rindex('.')+1, file.length ]
  else
    return mimetypes.include? MIME::Types.of( file ).to_s
  end
end