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'
提前谢谢.
有同样的问题.
只是替换
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)
文档中有一个很好的示例,描述了如何使用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)
| 归档时间: |
|
| 查看次数: |
8088 次 |
| 最近记录: |