Volver |

MimeType

Introducción

Un MIME Type especifica un tipo de archivo. Por ejemplo:

Extensión MIME Type MIME Type en bytes
xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  
png image/png b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR'

 

A continuación se presenta un link con una tabla con cuántos bytes se necesitan para determinar el MIME Type de un archivo:

https://www.garykessler.net/library/file_sigs.html

Detección del Mime Type usando Python3

Se puede adivinar el Mime Type de un archivo usando la librería llamada python-magic (https://pypi.org/project/python-magic/).

Por ejemplo:

>>> import magic
>>> magic.from_file("archivos_prueba/p.png")
'PNG image data, 649 x 308, 8-bit/color RGBA, non-interlaced'
>>> magic.from_file("archivos_prueba/p.png", mime=True)
'image/png'

También se puede hacer lo mismo desde un array de bytes:

>>> import magic
>>> archivo = open("archivos_prueba/p.png", "rb").read(128)
>>> magic.from_buffer(archivo)
'PNG image data, 649 x 308, 8-bit/color RGBA, non-interlaced'
>>> magic.from_buffer(archivo, mime=True)
'image/png'

Notar que se leyeron 128 bytes para poder determinar el MIME Type, sin embargo, es realmente difícil saber cuántos bytes leer para poder determinarlo.

 

Notar que el read() retorna una lista de bytes, por lo que podríamos hacer lo siguiente:

>>> import magic
>>> magic.from_buffer(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x89\x00\x00\x014\x08\x06\x00\x00\x00@k\xa9', True)

 

Si estás utilizando Django, podés hacerlo así:

import magic
from django.http import HttpResponse, HttpResponseNotAllowed


def upload_file(request):
    mime = magic.from_buffer(request.FILES['file'].read(128), mime=True)
    if mime not in ["application/pdf"]:
        return HttpResponseNotAllowed("Formato no valido")
    return HttpResponse("OK")

 

Detección del Mime Type usando el comando file Linux

Linux cuenta con una utilidad llamada file que permite determinar el tipo de un archivo.

$ file archivo.tar

El resultado será:

archivo.tar: POSIX tar archive (GNU) 

O sea, que indica que el archivo es un archivo tar.

En este artículo participaron: