2013-08-23 3 views
6

Ich möchte, dass der Benutzer Bilder in Google App Engine hochladen kann. Ich habe folgende (Python):Google App Engine (Python) - Hochladen einer Datei (Bild)

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

Informationen durch den Benutzer übermittelt wird unter Verwendung einer Form (HTML):

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

die dann durch verarbeitet wird:

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

jedoch Wenn ich versuche, ein Bild hochzuladen, sagen wir "Book.png", bekomme ich den Fehler: BadValueError: Expected str, got u'Book.png'

Irgendeine Idee was ist los? Ich arbeite seit einiger Zeit mit GAE, aber dies ist das erste Mal, dass ich Blobs verwenden musste.

Ich benutzte diesen Link: https://developers.google.com/appengine/docs/python/images/usingimages , die db, nicht ndb verwendet. Ich habe auch versucht, in einem Variablen Speicher das Bild zunächst wie in dem Link: storedInfo = self.request.get('image') und dann zu speichern: imagedata.image = ndb.Blob(storedInfo) Was mir auch einen Fehler gibt: AttributeError: 'module' object has no attribute 'Blob' Vielen Dank im Voraus.

+2

Der Fehler ist Ihnen zu sagen, dass Sie haben‘ Versuchen Sie, ein Unicode-Objekt als Wert eines Blobs zu setzen, der in diesem Fall der Dateiname zu sein scheint, nicht die Datei selbst. (Ich bin mir nicht sicher, wie t o Holen Sie sich die Rohdaten als str in webapp2, also nur als Kommentar zu schreiben) – geoffspear

+1

einen Grund, warum Sie nicht die Blobstore API als Datenspeicher verwenden? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

Vielen Dank Woble, aber was würdest du vorschlagen, was ich tue? Und Faisal, ich benutze es nicht, weil es db benötigt (ich benutze ndb) und webapp (ich benutze webapp2). – Albraa

Antwort

2

Sie enctype="multipart/form-data" zum Formular, um für diese

<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

Dort in der Dokumentation zu arbeiten hinzufügen muss ein gutes Beispiel ist, dass, wie Dateien Blobstore mit einem HTML-Formular hochladen beschreibt: https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

die Form einer uRL durch blobstore.create_upload_url('/foo') erzeugt zeigen soll, und es soll eine Unterklasse der BlobstoreUploadHandler bei /foo so aussehen:

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

Damit dies funktioniert, sollten Sie Ihr Datenmodell so ändern, dass in ImageData, image auf ndb.BlobKeyProperty() verwiesen wird.

Sie können Ihr Bild einfach aus einer URL erstellen, die von images.get_serving_url(imagedata.image) generiert wurde, optional in der Größe angepasst und beschnitten.

7

Hatte das gleiche Problem.

nur ersetzen

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

mit:

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

auch Ihre Form muss enctype = "multipart/form-data

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