Question

Je sais que je peux accepter les chargements d'image en ayant un formulaire qui soit soumis à App Engine comme suit:

<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>

Puis, dans le code Python, je peux faire quelque chose comme

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

Mais comment puis-je déterminer le type de contenu de cette image lorsque je la montrerai plus tard à l'utilisateur? Il semble que le moyen le plus robuste serait de comprendre cela à partir des données d'image elles-mêmes, mais comment l'obtenir facilement? Je n'ai rien vu de approprié dans le package d'images google.appengine.api.

Devrais-je simplement rechercher les en-têtes d'images magiques dans mon propre code, ou existe-t-il déjà une méthode pour cela quelque part?

Modifier:

Voici la solution simpliste que j'ai finalement utilisée, semble fonctionner assez bien pour mes besoins et évite d'avoir à stocker le type d'image dans un champ séparé dans le magasin de données:

# 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
Était-ce utile?

La solution

Au lieu d'utiliser self.request.get (nom du champ), utilisez self.request.POST [nom du champ]. Ceci retourne un objet cgi.FieldStorage (pour plus de détails, consultez la documentation de la bibliothèque Python), qui possède les attributs 'nomfichier', 'type' et 'valeur'.

Autres conseils

Essayez le module python mimetypes, il devinera le type de contenu et l'encodage pour vous,

par exemple

> > importer des types MIME

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

('video / mp4', Aucun)

Sur la base de mes recherches, les navigateurs, à l’exception d’Internet Explorer (version 6 au moins), déterminent le type mime du fichier à l’aide de son extension. Pour cela, vous pouvez utiliser un dictionnaire Python simple.

Malheureusement, je ne connais aucune méthode en Python qui tente de deviner le type d'image en lisant des octets magiques (comme fileinfo fait en PHP). Peut-être pourriez-vous appliquer le principe EAFP (Plus facile de demander pardon que d’autorisation) avec l’API de Google Appengine.

Oui, il semble que l’API de l’image ne vous dise pas le type d’image que vous avez chargé. Ce que je ferais dans ce cas est de construire ce dictionnaire Python pour mapper les extensions de fichier avec les types d'image mime et d'essayer de charger l'image en attendant une exception NotImageError () . Si tout se passe bien, alors je suppose que le type mime était OK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top