2011-01-05 2 views

ответ

42

ruby-filemagic камня сделает это:

require 'filemagic' 

puts FileMagic.new(FileMagic::MAGIC_MIME).file(__FILE__) 
# => text/x-ruby; charset=us-ascii 

Этого камень не смотрит на расширении файла на всех. Он читает немного содержимого файла и использует это, чтобы угадать тип файла.

+8

На OS X Мне просто нужно было «заварить установку libmagic» до того, как «gem install ruby-filemagic» будет работать. Но драгоценный камень работает как шарм для изображения/png, image/jpg, application/x-shockwave-flash, video/mp4, application/ogg, image/vnd.adobe.photoshop, application/pdf, video/x-ms- asf и т. д. –

+1

'apt-get install libmagic-dev', если вы на Ubuntu. – wpp

+0

Чтобы уточнить (и контрастировать с ответом @ NARKOZ), этот жемчуг не смотрит на расширение, чтобы найти тип mime, в отличие от опции MIME :: types. – alexanderbird

35

В Ruby на Rails вы можете сделать:

MIME::Types.type_for("filename.gif").first.content_type # => "image/gif" 
+0

> Возвращает список MIME :: Типы, принадлежащие файлу, на основе его расширения имени файла. Если платформа истинна, то будут возвращены только типы файлов, которые относятся к текущей платформе. – knoopx

+27

Недействительный ответ, он просто определяет тип файла на основе его расширения. Если вы назовете PNG-файл с расширением FLV, он обнаружит, что он будет => «video/x-flv» –

+9

Может быть достаточно хорошим, если вы обеспечите согласованное расширение файла. –

19

Вы можете использовать этот надежный метод базы на волшебном заголовке файла:

def get_image_extension(local_file_path) 
    png = Regexp.new("\x89PNG".force_encoding("binary")) 
    jpg = Regexp.new("\xff\xd8\xff\xe0\x00\x10JFIF".force_encoding("binary")) 
    jpg2 = Regexp.new("\xff\xd8\xff\xe1(.*){2}Exif".force_encoding("binary")) 
    case IO.read(local_file_path, 10) 
    when /^GIF8/ 
    'gif' 
    when /^#{png}/ 
    'png' 
    when /^#{jpg}/ 
    'jpg' 
    when /^#{jpg2}/ 
    'jpg' 
    else 
    mime_type = `file #{local_file_path} --mime-type`.gsub("\n", '') # Works on linux and mac 
    raise UnprocessableEntity, "unknown file type" if !mime_type 
    mime_type.split(':')[1].split('/')[1].gsub('x-', '').gsub(/jpeg/, 'jpg').gsub(/text/, 'txt').gsub(/x-/, '') 
    end 
end 
+8

Использование строковой интерполяции при запуске внешней команды в backticks, как правило, не очень хорошая идея. 'local_file_path' может быть установлен в'; rm -rf .'. В этом конкретном случае метод будет безопасно терпеть неудачу с «Errno :: ENOENT» без очистки текущего каталога, но лучше не полагаться на это, когда имя файла предоставляется пользователем. – rekado

-4

Вы можете использовать

Мим: : Type.lookup_by_extension (extention_name)

С благодарностью

+5

Downvoted, потому что расширение не имеет ничего общего с фактическим типом файла. Возможно, не будет расширения. – panzi

+0

Может быть достаточно хорошим, если вы обеспечите согласованное расширение файла. – NARKOZ

+1

-1, потому что это увековечивает веру в то, что расширения файлов связаны с типом файла (Windows - это единственное место, где это точно). – Dan

5

рубинового filemagic драгоценного камня хорошее решение, но требует дополнительных зависимостей от libmagic (недавно удален из CarrierWave как часть CarrierWave :: MagicMimeTypes удаления).

Если вас интересует чисто рубиновая реализация, рассмотрите драгоценный камень MimeMagic! Он хорошо работает для типов файлов, перечисленных в базе данных freedesktop.org мима:

require 'mimemagic' 

MimeMagic.by_magic(File.open('Table-Flip-Guy.jpg')).type # => "image/jpeg" 

Для Microsoft Office 2007+ форматов (XLSX, DOCX и PPTX), требует наложения (если вы не в порядке с родовым " Приложение/зип»MIME тип для этих файлов)

require 'mimemagic'  
require 'mimemagic/overlay' 

MimeMagic.by_magic(File.open('big_spreadsheet.xlsx')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
3

mimemagic камень будет также сделать это

https://github.com/minad/mimemagic

из Официальной документации

MimeMagic is a library to detect the mime type of a file by extension or by content. It uses the mime database provided by freedesktop.org (see http://freedesktop.org/wiki/Software/shared-mime-info/).

require 'mimemagic' 
MimeMagic.by_extension('html').text? 
MimeMagic.by_extension('.html').child_of? 'text/plain' 
MimeMagic.by_path('filename.txt') 
MimeMagic.by_magic(File.open('test.html')) 
# etc... 
1

filemagic gem - хорошее решение, но зависит от множества ненужных драгоценных камней. (Рельсы, AWS-СДК-ядро, ...)

Если ваше приложение маленькое и работает только в Linux или OSX, рассмотреть возможность использование file программы:

require 'shellwords' 
mimetype = `file --brief --mime-type - < #{Shellwords.shellescape(__FILE__)}`.strip 

Примечания: Заменить __FILE__ с любым выражом содержит путь к файлу.

Смежные вопросы