MIME (Multipurpose Internet Mail Extensions) type é um padrão utilizado na internet para indicar o tipo de conteúdo de um arquivo.
Originalmente desenvolvido para identificar os tipos de arquivos anexados a e-mails, o MIME type é agora amplamente utilizado em diferentes contextos, como na web, para indicar o tipo de conteúdo de arquivos transmitidos por meio do protocolo HTTP.
Cada tipo de arquivo é associado a um tipo MIME específico, que é representado por uma string. Por exemplo, o tipo MIME para arquivos de texto simples é text/plain, enquanto o tipo MIME para imagens JPEG é image/jpeg
. Existem centenas de tipos MIME padrão que cobrem uma variedade de tipos de arquivos, desde documentos de texto até arquivos de áudio e vídeo.
Nesse artigo veremos como identificar o mime-type
de um arquivo usando C++ tanto em distribuições GNU+Linux e como dica no Windows.
Para conseguirmos esse feitos em distribuições GNU+Linux utilizaremos a biblioteca libmagic.
Ela é a biblioteca utilizada pelo comando file, o qual será incluido o cabeçalho magic.h que é vinculada de forma estática(static).
Para instalar você pode usar o gerenciador de pacotes do seu sistema, alguns exemplos abaixo:
Caso você não encontre no repositório do seu sistema, você pode compilar do zero:
Lembre-se antes de possuir as ferramentas de compilação: gcc, make, além do wget para fazermos o download do tarball.
Para esse exemplo, vamos ver o mime-type
dessa imagem abaixo que é do formato PNG, faça o download clicando com o botão direito do mouse sobre a imagem e clicando em: Salvar como no diretório que estará o binário do código.
cpp-icon.png
Crie um arquivo main.cpp
e cole o código abaixo:
O código está devidamente comentado explicando cada bloco de código para elucidar ações.
Feito isso, é só compilarmos, é necessário passar a flag -lmagic
e rodar:
A possível e provavel saída será:
Note que se alterarmos a extensão do arquivo para uma extensão qualquer, mesmo o gerenciador de arquivos exibindo um ícone referente a extensão, a libmagic é segura e correta em relação a isso, mostrará qual o verdadeiro mime-type daquele arquivo.
Isso acontece muito em sistemas que pessoas mal intencinadas querem executar código na Web e a página pede para carregar somente arquivo: jpeg e png, mas alteram só a extensão, mas na verdade o arquivo é um script.
Se eu renomear o arquivo para .mp4
, por exemplo:
E alterar no código para carregar o cpp-icon.mp4
:
Após compilar e rodar, você verá que a libmagic exibirá o Mime-Type CORRETO! E não o da extensão.
No Windows, você pode usar a urlmon.h
com o código abaixo:
Lembrando que para você conseguir compilar, você precisa habilitar a urlmon.dll
no Registro do Windows, como descreve nesse link.
Existem diversas “bibliotecas” C++ no GitHub que faz um FAKE MIME-TYPE, ou seja, se fizermos o procedimento que descrevemos acima de renomear a extensão do arquivo, essas “bibliotecas”, nos informa o incorreto mime-type. Isso é inseguro e perigoso!
Por exemplo, encontrei essa aqui https://github.com/lasselukkari/MimeTypes, se você clonar:
Usar esse exemplo após renomear a extensão:
Compile seu arquivo e o MimeTypes.cpp
desse repositório:
Após rodar, note que ela informará incorretamente o tipo MIME do arquivo:
Isso não ocorre com a libmagic
!
Nem todos os repositórios no GitHub fazem um fake mime-type, mas fiquem atentos para esses casos!