MIME Types e extensões de arquivo - O que são e qual a sua relação
MIME Type ou Tipo MIME, é um padrão desenvolvido para ser utilizado originalmente em mensagens de correio eletrônico. MIME significa Multipurpose Internet Mail Extensions (1), e passou a ser definido já no início da década de 1990. Este padrão, cujo fim era o protocolo SMTP (2), acabou sendo estendido para outros protocolos de internet como o HTTP (3). Através dele é possível "dizer" aos outros softwares que tratam páginas e mensagens de internet qual a estrutura de dados dos arquivos e como estes devem ser interpretados e tratados.
Isto pode parecer estranho, afinal, pela internet, hoje, tanto em mensagens de e-mail quanto no intercâmbio de informações, vemos todos os tipos de dados circulando. Lemos mensagens de texto simples, mensagens formatadas (o que inclui textos ricos e imagens incorporadas), imagens e arquivos anexos e temos a impressão que sempre foi assim.
Acontece que quando foram criadas, as mensagens de e-mail e as páginas de internet permitiam apenas o tráfego de texto simples (ASCII) (4). Arquivos, formatações ricas e imagens vieram depois. O recurso dos MIME Types surgiu, portanto, para possibilitar, neste tráfego de dados entre diversos tipos de software (servidores, comunicadores instantâneos, clientes de e-mail e browsers de páginas web), que estes arquivos complexos pudessem ser lidos por estes programas e exibidos corretamente aos seus usuários.
Os Tipos MIME são informações que podem ser recuperadas por softwares e sistemas web. Isto permite que seja feita uma verificação pelos softwares de internet ou pelos programadores para se certificar de sua idoneidade. Para desenvolvedores de web, é possível ter acesso a esta informação através de funções nativas de linguagem como mime_content_type(), do PHP, para que, ao fazer um upload em um sistema qualquer, por exemplo, algum usuário maldoso seja impedido de enviar arquivos que tenham suas extensões trocadas propositadamente (como de .EXE para .PDF). Isto evita, como neste caso, que sejam enviados ao servidor aquivos executáveis maliciosamente disfarçados de algum outro tipo de ficheiro.
Extensões
Para quem não sabe, uma extensão de arquivo não tem nada de particular a não ser o fato de que é apenas a última parte do nome do arquivo. Uma extensão não prova nada em relação ao seu conteúdo. Existe, inclusive, uma meia verdade no fato de se achar que trocando a extensão, muda-se a característica do arquivo. Cada programa salva (guarda) os dados num ficheiro de uma forma proprietária, uma forma que apenas ele entende. Não é possível, portanto, alterar esta estrutura interna do ficheiro apenas alterando sua extensão. Transformar um arquivo em outro só acontece quando seus conteúdos têm o mesmo tipo de dados, como no caso de arquivos de texto plano (text/plain), como HTML, TXT, CSS, JavaScript, etc. Numa situação como essa é possível fazer um arquivo .TXT se transformar num .HTM. Porém, este .TXT só terá comportamento de .HTM se dentro dele contiver um texto escrito em linguagem HTML (que continua sendo texto simples do mesmo jeito, porém escrito dentro de um padrão próprio da linguagem).
Outra característica de uma extensão é que quando se instala um software ou se faz alguma configuração específica nele, a informação do nome da extensão é guardada no registro do sistema operacional e associada ao software que foi instalado. Assim, quando se dá dois cliques num arquivo (um HTML, por exemplo), essa ação abre o software associado e envia o ficheiro para dentro dele. Mas isso é só um entendimento do sistema operacional junto ao software. A despeito de que um ficheiro pode ter vários pontos fazendo parte do nome (ex.: meu.arquivo.de.texto.txt), a extensão continua sendo apenas o resto do nome do ficheiro depois do último ponto.
Note que, quando se trabalha com sistemas operacionais case sensitives (sensitivo à caixa) como Unix e Linux, estes diferenciam arquivos que tenham seus nomes escritos com maiúsculas e minúsculas. Exemplo: meuarquivo.htm é diferente de MeuArquivo.htm.
Para o Windows eles são exatamente iguais. Para o Linux, diferentes. O mesmo vai valer para arquivos com caixas diferentes nas extensões. Exemplo: MeuArquivo.htm é diferente de MeuArquivo.HTM.
Isso porque, como comentado, a extensão é apenas o pedaço final do nome do arquivo. Ser escrito em caixas diferentes, a depender do sistema operacional, faz diferença. Portanto, se você envia a um servidor Linux um arquivo "meuarquivo.HTM" e chama sua página HTML através da instrução 'href="meuarquivo.htm"' ele nunca será localizado neste tipo de servidor.
Curioso também é o fato de que, enquanto aplicativos de desktop como browsers, por exemplo, entendem os arquivos pelo seu MIME Type, outros tentam entendê-lo pela extensão. Se um arquivo de imagem .JPG tiver sua extensão alterada para .GIF ou .TXT, o browser continuará sabendo que ele é um JPG, e o exibirá normalmente. Versões mais antigas de programas como o Photoshop, simplesmente, não o reconhecerão. Até se este mesmo arquivo tiver sua extensão retirada, continuará sendo reconhecido pelo software de internet porque sua estrutura interna (que está diretamente ligada ao Tipo MIME) continuará sendo a mesma. No entanto, tentativas de enganar o software como trocar a extensão de um arquivo de um tipo (imagem) para um arquivo de outro tipo (texto) pode confundir o navegador.
Por essas e outras, para usuários de computador com perfil mais avançado, é substancial fazer com que o sistema operacional (como o Windows, por exemplo) exiba as extensões, pois, nem sempre é possível descobrir quais os tipos de arquivo que estão numa mesma pasta - e que tenham nomes iguais - se a gente não consegue ler as extensões deles. Para auxiliar o usuário o sistema operacional sempre associará um ícone ao tipo de ficheiro (desde que haja um catálogo em seu banco - nesse caso, o Registro do Windows, que associa essa extensão a seu ícone armazenado em DLLs ou executáveis dos softwares proprietários) apenas lendo sua extensão e, no entanto, nem sempre será possível descobrir a extensão desses ficheiros através de seus ícones representativos - porque nem sempre sabemos quais são todos os tipos de arquivo que existem na máquina e porque, volta e meia, os softwares mudam a estética de seus próprios ícones, tornando sua memorização muito confusa.
Páginas web
Num cabeçalho HTML (< head>) de uma página web, quando se faz a inclusão de arquivos de estilo e processamento, como CSS e JavaScript, é importante informar ao browser o Tipo MIME através do atributo "type" do seu código de inclusão. Este código de inclusão poderia ser algo assim:
link rel="stylesheet" type="text/css" href="style.css"
Isto se deve ao fato de que, apesar de ser um arquivo de texto puro, o navegador de internet deverá entender de que maneira este arquivo deve ser tratado/interpretado. Caso se omita "rel" e "type", mesmo que seja corretamente especificado seu endereço no servidor, o ficheiro, provavelmente, não será interpretado como um ficheiro com instruções de estilo (mesmo contendo a extensão CSS), e o leiaute de sua página quebrará.
Na nomenclatura de "type", a primeira parte antes da barra representa o tipo e a segunda parte representa o subtipo. Assim, num ficheiro CSS incorporado a uma página HTML, seu type será "text" e o subtype será "css", o que indica que este é um ficheiro de texto plano mas que deve ser tratado pelo navegador de internet como um ficheiro de folhas de estilo.
Exemplos de outros MIME Types muito utilizados na web:
| image/png | .PNG | Imagem PNG |
| application/pdf | Arquivo PDF | |
| video/mp4 | .MP4 | Vídeo MP4 |
| application/msword | .DOC | Arquivo do Microsoft Word |
Nesses casos, caso o navegador tenha o plugin para exibir o arquivo, ele o fará na própria janela do programa, sem precisar solicitar o download para o computador do usuário. Caso não, o download será feito e o usuário terá de ver o arquivo em seu software nativo (de criação ou visualização).
Finalizando
Entendendo que os Tipos MIME proporcionam uma maneira segura de como interpretar os dados que circulam pela internet, todo desenvolvedor web deve tentar se valer de sua utilidade ao criar seus sistemas:
• Ao fazer inclusões de arquivos em páginas HTML, quando isto for necessário (ex.: .js - application/javascript, .css - text/css, dentre outros).
• Ao utilizar o recurso de forçar downloads em páginas de programação (ex.: 'header' do PHP) associando o tipo de dado à extensão.
• Ao permitir que usuários de seu sistema façam uploads de arquivos (ex.: fazer a verificação do MIME Type ao invés de priorizar a extensão para descobrir o tipo do arquivo).
• Ao especificar o tipo de dado em formulários de upload (enctype="multipart/form-data").
• Ao enviar e-mails através de páginas de programação (MIME-Version: 1.1, Content-type: text/plain (html),charset=utf-8).
• Ao especificar dados de sua página web, como o charset.
Caso queira complementar seu conhecimento sobre MIME, acesse os links abaixo:
Stack Overflow - O que são MIME Types
MDN WebDocs - MIME types
Wikipedia - Tipo de mídia da Internet
CCM - Padrão MIME
Wikipedia - MIME
GTA/UFRJ - S/MIME
IANA - Lista de tipos MIME existentes
Legenda das siglas citadas:
(1) - MIME - Multipurpose Internet Mail Extensions ou Extensões Multi função para Mensagens de Internet
(2) - SMTP - Send Mail Transfer Protocol ou Protocolo de Envio de Mensagens de Correio
(3) - HTTP - HiperText Transfer Protocol ou Protocolo de Transferência de HiperTexto
(4) - ASCII - American Standard Code for Information Interchange ou Código Padrão Americano para o Intercâmbio de Informação
Entenda melhor o que são os Tipos MIME, para que servem e sua relação com extensões de arquivo.
Palavras chave: mime type, tipos mime, o que são mime types, o que são tipos mime
Artigo técnico sobre imagens bitmap. Visão geral, tipos de formatos, características e extensões