Estou trabalhando em um projeto onde temos que identificar os tipos MIME dos arquivos enviados corretamente (fora do controller, que tem o content_type enviado), e em alguns dos testes feitos (vocês fazem testes, correto?) foi identificado que o tipo incorreto de um arquivo estava passando, sendo “ludiabriado” apenas trocando a extensão do arquivo.
Verificando a gem que eu estava utilizando, vi que ela, como tantas outras, levava em conta a extensão do arquivo para retornar o MIME, o que achei bem frágil. Era só copiar um .jpg como .zip para ele retornar o tipo como application/zip.
Foi aí que encontrei a Mahoro. Ela se utiliza do funcionamento da libmagic (ei, não é a ImageMagick, hein?!), que utiliza o mesmo princípio de identificação de arquivos que o comando file, que é um “sistema de padrões mágicos”, como descrito:
The file(1) command identifies the type of a file using, among other tests, a test for whether the file contains certain ”magic patterns”. The file /usr/share/misc/magic specifies what patterns are to be tested for, what message or MIME type to print if a particular pattern is found, and additional information to extract from the file.
Para instalar a gem, é necessário algumas libs, que no Ubuntu são:
sudo apt-get install libmagic1 libmagic-dev
Para usar depois, bem fácil, pegando de exemplo um .zip que copiei como .jpg:
require "mahoro" Mahoro.new(Mahoro::MIME).file("/tmp/caca.jpg").split(";")[0]
Isso retorna corretamente application/zip. Vale lembrar que, acredito eu, que isso não funcionará em sistemas Windows (mas você não está rodando o seu projeto lá, está?!).