2013-08-23 8 views
6

Я хочу, чтобы пользователь мог загружать изображения в Google App Engine. У меня есть следующие (Python):Google App Engine (Python) - Загрузка файла (изображения)

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

информация представлена ​​пользователем с помощью формы (HTML):

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

, который затем обрабатывается:

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

Однако, когда я пытаюсь загрузить изображение, скажем, «Book.png», я получаю сообщение об ошибке: BadValueError: Expected str, got u'Book.png'

Любая идея, что происходит? Я работаю с GAE в течение некоторого времени, но это первый раз, когда я должен был использовать blobs.

Я использовал эту ссылку: https://developers.google.com/appengine/docs/python/images/usingimages который использует db, а не ndb. Я также попытался сохранения изображения в переменной первой, как в ссылке: storedInfo = self.request.get('image') , а затем хранить его: imagedata.image = ndb.Blob(storedInfo) что и дает мне ошибку: AttributeError: 'module' object has no attribute 'Blob' Спасибо заранее.

+2

ошибка говорит вам, что вы» re пытается установить объект Unicode как значение blob, которое в этом случае, по-видимому, является именем файла, а не самими данными файла (я не уверен, как t o получить необработанные данные как str в webapp2, так что просто разместите в качестве комментария) – geoffspear

+1

по какой-либо причине вы не используете apb blobstore, чем хранилище данных? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

Спасибо, Wooble, но что бы вы предложили мне сделать? И Faisal, я не использую его, потому что ему нужен db (я использую ndb) и webapp (я использую webapp2). – Albraa

ответ

2

Вы должны добавить enctype="multipart/form-data" в форму для того, чтобы это работало

<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

Существует отличный пример в документации, которая описывает, как загрузить файлы на Blobstore с помощью HTML-формы: https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

форма должна указывать на URL, генерируемого blobstore.create_upload_url('/foo') и не должно быть подкласс BlobstoreUploadHandler в /foo, например так:

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

Для этого вам следует изменить свою модель данных, чтобы в ImageData, image ссылается на ndb.BlobKeyProperty().

Вы можете подать свое изображение просто с URL-адреса, созданного images.get_serving_url(imagedata.image), опционально измененного размера и обрезанного.

7

Был такой же вопрос.

просто заменить

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

с:

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

также ваша форма должна иметь ENCTYPE = "многокомпонентные/form-данные

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
Смежные вопросы