谷歌应用程序引擎(Python)-上传文件(图像)

谷歌应用程序引擎(Python)-上传文件(图像),python,image,google-app-engine,upload,app-engine-ndb,Python,Image,Google App Engine,Upload,App Engine Ndb,我希望用户能够上传图像到谷歌应用程序引擎。我有以下内容(Python): 信息由用户使用表单(HTML)提交: 但是,当我尝试上传图像时,比如说“Book.png”,我得到了错误: BadValueError:应为str,获得u'Book.png' 知道发生了什么吗?我已经和GAE合作了很长一段时间,但这是我第一次不得不使用BLOB 我使用了这个链接: 它使用db,而不是ndb。 我还尝试先将图像存储在变量中,如链接中所示: storedInfo=self.request.get('image'

我希望用户能够上传图像到谷歌应用程序引擎。我有以下内容(Python):

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

但是,当我尝试上传图像时,比如说“Book.png”,我得到了错误:
BadValueError:应为str,获得u'Book.png'

知道发生了什么吗?我已经和GAE合作了很长一段时间,但这是我第一次不得不使用BLOB

我使用了这个链接: 它使用db,而不是ndb。 我还尝试先将图像存储在变量中,如链接中所示:
storedInfo=self.request.get('image')
然后存储它:
imagedata.image=ndb.Blob(storedInfo)
这也给了我一个错误:
AttributeError:“module”对象没有属性“Blob”

提前感谢。

您必须将
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>

姓名:
图片:

文档中有一个很好的例子,描述了如何使用HTML表单将文件上载到Blobstore:

表单应该指向由
blobstore.create\u upload\u url('/foo')
生成的url,并且在
/foo
处应该有
BlobstoreUploadHandler
的子类,如下所示:

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为您的图像提供服务。获取服务url(imagedata.image)
,可以选择调整大小和裁剪。

也有同样的问题

替换

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

您的表单还需要有enctype=“multipart/form数据

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


错误告诉您试图将Unicode对象设置为blob的值,在本例中,该值似乎是文件名,而不是文件数据本身。(我不确定如何在webapp2中以str的形式获取原始数据,因此仅作为注释发布)你为什么不使用blobstore api而不是数据存储?谢谢你,Wooble,但是你建议我怎么做?Faisal,我不使用它是因为它需要db(我使用ndb)和webapp(我使用webapp2)。我不使用webapp2(或webapp)但是粗略地检查一下文档就会发现您做得不对。上传的文件通常会通过cgi.FieldStorage obejct访问-请参阅文档。此外,您可能需要将编码通常设置为类似于多部分/表单数据的内容-请参阅文档-您能为该示例添加一个链接吗问题,完成了吗?我认为这只适用于Python2.7-我现在正在寻找Python3.7的等效版本。让浏览器发布到app engine,然后将其写入云存储似乎很简单,但能够让用户直接发布到云存储,我还没有找到相关文档。
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 = self.request.get('image')
imagedata.image = str(self.request.get('image'))
<form name = "input" action = "/register" method = "post" enctype="multipart/form-data">