2012-11-27 17 views
7

La webapp2 di Google appengine ha un valore molto criptico documentation regarding the handling of uploaded files.Come gestire i file caricati in webapp2

Uploaded files are available as cgi.FieldStorage (see the cgi module) instances directly in request.POST. 

Ho una forma che fa una richiesta POST di file JSON che voglio conservare in un NDB.JsonProperty.

Qualcuno può offrire un breve esempio di come leggo il file dall'oggetto richiesta?

+0

Il POST è codificato come 'application/x-www-form-urlencoded' o' multipart/form-data'? –

+0

domanda simile: http://stackoverflow.com/questions/6846333/how-does-cgi-fieldstorage-store-files –

+0

Martijn: Sto usando multipart/form-data, dovrei usare l'altro tipo? – fccoelho

risposta

0

Invece di utilizzare la soluzione di cui How does cgi.FieldStorage store files?, ho usato enctype = "multipart/form-data" nella forma, e

nel metodo del gestore per il post ho avuto accesso al file via:

file_content = self.request.POST.multi['myfieldname'].file.read() 

ha funzionato!

+0

Ho dovuto definire i valori di JsonProperty come compressi nel modello, altrimenti avrei ricevuto un errore di inserimento troppo grande ... – fccoelho

7

È possibile utilizzare enctype="multipart/form-data" nel modulo, e quindi ottenere il contenuto del file utilizzando nel gestore:

raw_file = self.request.get('field_name') 

Poi, passare raw_file come ingresso alla proprietà del modello.

+0

ha funzionato per me, restituisce l'intero file. –

4

Il documento di Google fa schifo. Ho passato circa due ore a sperimentare con l'oggetto richiesta di webapp2 e finalmente ho trovato un modo per farlo.

Controllare https://stackoverflow.com/a/30969728/2310396.

I frammenti di codice di base è qui:

class UploadHandler(BaseHandler): 
    def post(self): 
     attachments = self.request.POST.getall('attachments') 

     _attachments = [{'content': f.file.read(), 
         'filename': f.filename} for f in attachments] 

Usiamo self.request.POST.getall('attachments') invece di self.request.POST.get('attachments'), in quanto possono essere molteplici input campo in form HTML con lo stesso nome, quindi se si utilizza self.request.POST.get('attachments'), ti prendine solo uno.

+1

Si noti che questa soluzione presuppone la presenza di un campo modulo chiamato 'allegati 'nel modulo. Non è una parola chiave magic webapp2 o altro. – Sam

Problemi correlati