Domanda

So che posso accettare i caricamenti di immagini avendo un modulo che invia POST ad App Engine in questo modo:

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

Quindi nel codice Python posso fare qualcosa del genere

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

Ma come posso capire quale dovrebbe essere il tipo di contenuto di questa immagine quando in seguito la mostra all'utente? Sembra che il modo più efficace sarebbe quello di capirlo dai dati dell'immagine stessa, ma come ottenerlo facilmente? Non ho visto nulla di adatto nel pacchetto di immagini google.appengine.api.

Dovrei solo cercare le intestazioni delle immagini magiche nel mio codice o esiste già un metodo per farlo da qualche parte?

Modifica:

Ecco la soluzione semplicistica che ho finito per usare, sembra funzionare abbastanza bene per i miei scopi ed evita di dover archiviare il tipo di immagine come campo separato nell'archivio dati:

# 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
È stato utile?

Soluzione

Invece di usare self.request.get (fieldname), usa self.request.POST [fieldname]. Ciò restituisce un oggetto cgi.FieldStorage (vedere i documenti della libreria Python per i dettagli), che ha gli attributi 'nome file', 'tipo' e 'valore'.

Altri suggerimenti

Prova il modulo mimetypes di Python, indovina il tipo di contenuto e la codifica per te,

per es.

> > import mimetypes

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

('video / mp4', nessuno)

In base alla mia ricerca, i browser, ad eccezione di Internet Explorer (almeno versione 6), determinano il tipo mime del file utilizzando l'estensione del file. Dato che vuoi tipi di immagini mime, puoi usare un semplice dizionario Python per raggiungere questo obiettivo.

Sfortunatamente non conosco alcun metodo in Python che tenti di indovinare il tipo di immagine leggendo alcuni byte magici (il modo fileinfo funziona in PHP). Forse potresti applicare il principio EAFP (Più facile chiedere perdono che autorizzazione) con l'API per le immagini dell'appengine di Google.

Sì, sembra che l'API immagine non ti dica il tipo di immagine che hai caricato. Quello che farei in questo caso è costruire quel dizionario Python per mappare le estensioni di file ai tipi mime di immagine e quindi provare a caricare l'immagine aspettandomi un'eccezione NotImageError () . Se tutto va bene, allora presumo che il tipo mime fosse OK.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top