7

我希望用户能够将图像上传到 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 已经有一段时间了,但这是我第一次不得不使用 blob。

我使用了这个链接: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' 提前致谢。

4

3 回答 3

9

有同样的问题。

只需更换

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

和:

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

你的表单也需要有 enctype="multipart/form-data

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data">
于 2014-05-28T03:21:13.630 回答
5

文档中有一个很好的示例,描述了如何使用 HTML 表单将文件上传到 Blobstore:https ://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

表单应该指向一个生成的 url,blobstore.create_upload_url('/foo')并且应该有一个BlobstoreUploadHandlerat的子类,/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()

为此,您应该更改数据模型,以便在ImageDataimage引用ndb.BlobKeyProperty()

您可以简单地从由 生成的 url 提供您的图像images.get_serving_url(imagedata.image),可以选择调整大小和裁剪。

于 2013-10-09T16:49:06.197 回答
3

您必须添加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>
于 2013-09-20T14:35:40.257 回答