Драгоценный камень ruby-filemagic является хорошим решением, но требует дополнительных зависимостей от libmagic (недавно удален из CarrierWave как часть удаления CarrierWave :: MagicMimeTypes ).
Если вы заинтересованы в реализации в чистом рубине, рассмотрите гем MimeMagic ! Он хорошо работает для типов файлов, перечисленных в базе данных mime freedesktop.org:
require 'mimemagic'
MimeMagic.by_magic(File.open('Table-Flip-Guy.jpg')).type # => "image/jpeg"
Для форматов Microsoft Office 2007+ (xlsx, docx и pptx) требуется наложение (если вы не согласны с универсальным типом MIME "application / zip" для этих файлов)
require 'mimemagic'
require 'mimemagic/overlay'
MimeMagic.by_magic(File.open('big_spreadsheet.xlsx')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"