Pregunta

Sé que puedo aceptar subidas de imágenes al tener un formulario que se envía de forma automática al App Engine de esta manera:

<form action="/upload_received" enctype="multipart/form-data" method="post">
<div><input type="file" name="img"/></div>
<div><input type="submit" value="Upload Image"></div>
</form>

Luego, en el código Python, puedo hacer algo como

image = self.request.get("img")

¿Pero cómo puedo averiguar cuál debería ser el tipo de contenido de esta imagen cuando más tarde se la muestre al usuario? Parece que la forma más robusta sería descifrar esto a partir de los datos de la imagen en sí, pero ¿cómo obtener eso fácilmente? No vi nada adecuado en el paquete de imágenes google.appengine.api.

¿Debo buscar los encabezados de imágenes mágicas en mi propio código, o ya existe un método para eso?

Editar:

Aquí está la solución simplista que terminé usando, parece funcionar lo suficientemente bien para mis propósitos y evita tener que almacenar el tipo de imagen como un campo separado en el almacén de datos:

# Given an image, returns the mime type or None if could not detect.
def detect_mime_from_image_data(self, image):
    if image[1:4] == 'PNG': return 'image/png'
    if image[0:3] == 'GIF': return 'image/gif'
    if image[6:10] == 'JFIF': return 'image/jpeg'
    return None
¿Fue útil?

Solución

En lugar de usar self.request.get (fieldname), use self.request.POST [fieldname]. Esto devuelve un objeto cgi.FieldStorage (consulte la documentación de la biblioteca de Python para obtener detalles), que tiene los atributos 'nombre de archivo', 'tipo' y 'valor'.

Otros consejos

Pruebe el módulo de tipos MIME de Python, adivinará el tipo de contenido y la codificación,

por ejemplo

> > importar mimos tipos

> > mimetypes.guess_type (" /home/sean/desktop/comedy/30seconds.mp4")

('video / mp4', Ninguno)

Según mi investigación, los navegadores, a excepción de Internet Explorer (al menos la versión 6), determinan el tipo de mime de archivo utilizando la extensión del archivo. Dado que quieres tipos de imágenes mime, puedes usar un diccionario de Python simple para lograr esto.

Desafortunadamente, no conozco ningún método en Python que intente adivinar el tipo de imagen leyendo algunos bytes mágicos (la forma fileinfo lo hace en PHP). Tal vez podría aplicar el principio de EAFP (más fácil de perdonar que el permiso) con la API de la imagen del appengine de Google.

Sí, parece que la imagen API no le dice el tipo de imagen que ha cargado. Lo que haría en este caso es compilar ese diccionario de Python para asignar extensiones de archivo a tipos de mimos de imágenes y luego tratar de cargar la imagen mientras se espera una excepción NotImageError () . Si todo va bien, asumo que el tipo mime estaba bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top