谷歌应用引擎:在数据库中存储图像(Python)

谷歌应用引擎:在数据库中存储图像(Python),python,database,google-app-engine,gql,Python,Database,Google App Engine,Gql,我正在使用Python在Google App Engine上创建一个电子商务平台。为此,我需要将我将提供的产品的详细信息存储在一个单独的实体中,该实体还将包括每个产品的图像。现在,如何在数据存储中存储图像?此外,更重要的是,如何从数据库中提取图像并在应用程序上向用户显示 编辑: 将图像上传到“图像”实体后,我试图显示它。下面是相同的代码: main.py class FileUpload(Handler): def post(self): file_upload = se

我正在使用Python在Google App Engine上创建一个电子商务平台。为此,我需要将我将提供的产品的详细信息存储在一个单独的实体中,该实体还将包括每个产品的图像。现在,如何在数据存储中存储图像?此外,更重要的是,如何从数据库中提取图像并在应用程序上向用户显示

编辑:

将图像上传到“图像”实体后,我试图显示它。下面是相同的代码:

main.py

class FileUpload(Handler):
    def post(self):
        file_upload = self.request.POST.get("file", None)
        file_name = file_upload.filename
        image = Images(id=file_name, file_name=file_name, blob=file_upload.file.read())
        image.put()

        self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
        self.response.write(image.blob)
        self.final()

    def final(self):
        images = db.GqlQuery("Select * FROM Images WHERE file_name = 'CN.jpg'")
        self.render("template.html", images = images)

class Blob(Handler):
    def get(self):
        self.render("blob.html")


app = webapp2.WSGIApplication([('/', MainPage),
                                ('/signup', Register),
                                ('/login', Login),
                                ('/logout', Logout),
                                ('/mp', MP),
                                (r'/file_upload', FileUpload),
                                ('/blob', Blob)], debug=True)
template.html

<html>
<head>
    <title>Template</title>
</head>
<body>
    {%
        for image in images
    %}
    <div>{{image.blob}}</div>
    {%endfor%}
</body>
</html>
blob.html

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Image Upload</title>
</head>
<body>
<form action="/file_upload" enctype="multipart/form-data" method="post">
    <div><input type="file" name="file"/></div>
    <div><input type="submit" value="Upload"></div>
</form>
</body>
</html>
现在,在template.html中,我希望显示我试图提取的图像。但是,我得到以下错误:

<div>{{image.blob}}</div>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

您可以使用谷歌高性能图像服务。您必须将图像存储或上载到blobstore或Google云存储,并创建一个服务url

好处:

高性能 谷歌将提供这些图片。您不需要处理程序; 花钱少的 动态调整大小和裁剪。 更多:在以下位置提供blob:
获取服务url:

有几个选项,您可以根据图像大小和工作流来决定

如果图像是固定的,并且仅由开发团队更改,则可以将其作为静态文件包含。 您可以使用启用图像的上载和查看。 您也可以使用来上传/查看。我得到的印象是,谷歌正朝着这个方向而不是向blobstore迈进。
上载图像、将其保存在数据存储中并为图像提供服务的基本示例

fileupload.py:

import webapp2
from google.appengine.ext import ndb
import mimetypes


class Images(ndb.Model):
    file_name = ndb.StringProperty()
    blob = ndb.BlobProperty()


class FileUpload(webapp2.RequestHandler):

    def post(self):

        file_upload = self.request.POST.get("file", None)
        file_name = file_upload.filename
        image = Images(id=file_name, file_name=file_name, blob=file_upload.file.read())
        image.put()

        self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
        self.response.write(image.blob)


class ImgServe(webapp2.Requesthandler):

    def get(self, resource):

        image = ndb.Key('Images', resource).get()
        self.response.headers[b'Content-Type'] = mimetypes.guess_type(image.file_name)[0]
        self.response.write(image.blob)            
以下是用于发布图像的静态表单:

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Image Upload</title>
</head>
<body>
<form action="/file_upload" enctype="multipart/form-data" method="post">
    <div><input type="file" name="file"/></div>
    <div><input type="submit" value="Upload"></div>
</form>
</body>
</html>
映像服务器的路由:


看一看那块石头。另请参见图像文档。这里可能有一些有用的东西:我不能将本地机器上的图像添加到数据存储中吗?我不能将本地机器上的图像添加到数据存储中吗?是的,您可以。可以将图像放置在blob属性中,但图像的大小受实体大小的限制。如果你把图片放在数据存储中,你必须自己提供图片。见下面的例子。我已经编辑了我的原始帖子。无法显示存储在数据存储中“Images”实体中的图像。不能以这种方式显示图像。您必须使用HTML+1来处理和完成代码。顺便说一句,可能会声明密钥应该以image=ndb.keyursafe=resource.gets的形式发送并在处理程序中获取。有一种更好的方式来提供图像。如果将图像保存在blobstore或cloudstorage GCS中,则可以使用服务url。如果你要求图片获得服务url,谷歌将提供图片。更多信息请点击此处:
webapp2.Route(r'/file_upload', handler='fileupload.FileUpload')
webapp2.Route(r'/img_serve/<resource:(.*)>', handler='fileupload.ImgServe'))