Back-End

1 mar, 2013

Identificando o tipo MIME em Ruby

Publicidade

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á?!).