Google App Engine(Python) - 上传文件(图片)

Alb*_*raa 6 python upload google-app-engine image app-engine-ndb

我希望用户能够将图像上传到Google App Engine.我有以下(Python):

class ImageData(ndb.Model):
     name = ndb.StringProperty(indexed=False)
     image = ndb.BlobProperty()
Run Code Online (Sandbox Code Playgroud)

用户使用表单(HTML)提交信息:

<form name = "input" action = "/register" method = "post">
    name: <input type = "text" name = "name">
    image: <input type = "file" name = "image">
</form>
Run Code Online (Sandbox Code Playgroud)

然后由以下处理:

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()
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试上传图片时,让我们说"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' 提前谢谢.

Ora*_*ane 8

有同样的问题.

只是替换

imagedata.image = self.request.get('image')
Run Code Online (Sandbox Code Playgroud)

有:

imagedata.image = str(self.request.get('image'))
Run Code Online (Sandbox Code Playgroud)

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

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)


pfa*_*lke 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()
Run Code Online (Sandbox Code Playgroud)

为此,您应该更改您的数据模型ImageData,image以便参考a ndb.BlobKeyProperty().

您可以简单地从生成的网址提供图片images.get_serving_url(imagedata.image),也可以选择调整大小和裁剪.


小智 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>
Run Code Online (Sandbox Code Playgroud)