2013-08-23 16 views
6

Desidero che l'utente sia in grado di caricare immagini su Google App Engine. Ho il seguente (Python):Google App Engine (Python) - Caricamento di un file (immagine)

class ImageData(ndb.Model): 
    name = ndb.StringProperty(indexed=False) 
    image = ndb.BlobProperty() 

informazioni è presentata dall'utente utilizzando un modulo (HTML):

<form name = "input" action = "/register" method = "post"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 

che viene poi elaborato da:

class AddProduct(webapp2.RequestHandler): 
    def post(self): 
     imagedata = ImageData(parent=image_key(image_name)) 
     imagedata.name = self.request.get('name') 
     imagedata.image = self.request.get('image') 
     imagedata.put() 

Tuttavia, quando provo a caricare un'immagine, diciamo "Book.png", ho ricevuto l'errore: BadValueError: Expected str, got u'Book.png'

Qualche idea su cosa sta succedendo? Ho lavorato con GAE per un po 'di tempo, ma questa è la prima volta che ho dovuto usare BLOB.

Ho utilizzato questo collegamento: https://developers.google.com/appengine/docs/python/images/usingimages che utilizza db, non ndb. Ho provato anche memorizzare l'immagine in una variabile prima come nel link: storedInfo = self.request.get('image') e poi riporlo: imagedata.image = ndb.Blob(storedInfo) Il che mi dà anche un errore: AttributeError: 'module' object has no attribute 'Blob' Grazie in anticipo.

+2

L'errore che si sta dicendo che si' cercando di impostare un oggetto Unicode come valore di un blob, che in questo caso sembra essere il nome del file, non i dati del file stesso. (Non so come o ottenere i dati grezzi come una str in webapp2, quindi semplicemente postare come commento) – geoffspear

+1

qualsiasi motivo per cui non si sta utilizzando l'API blobstore di datastore? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

Grazie Wooble, ma cosa suggeriresti di fare? E Faisal, non lo sto usando perché ha bisogno di db (sto usando ndb) e webapp (sto usando webapp2). – Albraa

risposta

2

È necessario aggiungere enctype="multipart/form-data" al modulo in modo che questo funzioni

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 
4

V'è un grande esempio nella documentazione che descrive come caricare i file sul blobstore utilizzando un modulo HTML: https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

il modulo dovrebbe puntare a un URL generato da blobstore.create_upload_url('/foo') e ci dovrebbe essere una sottoclasse della BlobstoreUploadHandler a /foo come questo:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
    upload_files = self.get_uploads('file') 
    blob_info = upload_files[0] 
    imagedata = ImageData(parent=image_key(image_name)) 
    imagedata.name = self.request.get('name') 
    imagedata.image = blob_info.key() 
    imagedata.put() 

Per fare in modo che funzioni, è necessario modificare il modello di dati in modo che in ImageData, image faccia riferimento a ndb.BlobKeyProperty().

È possibile pubblicare l'immagine semplicemente da un url generato da images.get_serving_url(imagedata.image), eventualmente ridimensionato e ritagliato.

7

Aveva lo stesso problema.

basta sostituire

imagedata.image = self.request.get('image') 

con:

imagedata.image = str(self.request.get('image')) 

anche il modulo ha bisogno di avere enctype = "multipart/form-data

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data">