【问题标题】:How to display an image in GAE datastore?如何在 GAE 数据存储中显示图像?
【发布时间】:2011-11-24 16:46:55
【问题描述】:

我阅读了教程和所有我能找到的关于显示保存在数据存储中的图像的资源,但我仍然无法让它工作。我很感激任何帮助。 This is my previous question.

下面的代码,/displayimage 显示图像的链接断开;对于/image,它给出BadKeyError: Invalid string key . 根据Nick Johnson reply here,我必须为img_id 传递一个空字符串,但/display image 中的logging.info 显示这个键:(((result.key():)))) agpkZXZ-dGluZy0xcg8LEghIb21lUGFnZRjOCAw。感谢您的帮助。

class HomePage(db.Model):
    thumbnail = db.BlobProperty()
    firm_name = db.StringProperty()

class ImageUpload(webapp.RequestHandler):
    def get(self):
...        
        self.response.out.write("""
        <form action="/imagesave" enctype="multipart/form-data" method="post">
        <div><label>firm name:</label> <input type="text" name="firm_name" size=40></div>
        <div><input type="file" name="img" /></div>
        <div><input type="submit" value="Upload image"></div>
        </form>
        """)

class ImageSave(webapp.RequestHandler):
    def post(self):
        homepage = HomePage()
        thumbnail = self.request.get("img")
        firm_name = self.request.get("firm_name")
        homepage.thumbnail = db.Blob(thumbnail)
        homepage.firm_name = firm_name
        homepage.put()

        self.redirect("/imageupload")

class ImageResize(webapp.RequestHandler):
    def post(self):
        q = HomepageImage.all()
        q.filter("firm_name", "mta")
        qTable = q.get()

        if qTable:
            qTable.thumbnail = db.Blob(images.resize(self.request.get("img"), 32, 32))
            db.put(qTable)
        else:
            self.response.out.write("""firm not found""")
        self.redirect("/imageupload")

class DisplayImage(webapp.RequestHandler):
    def get(self):
...
        query = HomePage.all()
        query.filter("firm_name", "mta")
        result = query.get()

        self.response.out.write("""firm name: %s""" % result.firm_name)

        #self.response.out.write("""<img src="img?img_id=%s"></img>""" %
        #chenged this line as systempuntoout's comment to:
        self.response.out.write("""<img src="/image?img_id=%s"></img>""" %
        result.key())
        #but I still get the same error
class Image(webapp.RequestHandler):
    def get(self):
...
    #I am adding the next line to show that "img_id" is an empty string.
    #why "img_id" empty here?

    img_id = self.request.get("img_id")
    logging.info("""**************************img_id: %s**************************""" % img_id)
    #**************************img_id: **************************

        homepage = db.get(self.request.get("img_id"))

        if homepage.thumbnail:
            self.response.headers['Content-Type'] = "image/jpg"
            self.response.out.write(homepage.thumbnail)
        else:
            self.response.out.write("no image")


application = webapp.WSGIApplication(
[
("/imageresize",ImageResize),
("/imageupload", ImageUpload),
("/displayimage", DisplayImage),
("/imagesave", ImageSave),
("/image", Image),
],                                      
debug=True
)

def main():
    run_wsgi_app(application)
if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python image google-app-engine


    【解决方案1】:

    您将图像源指向未定义的错误img 路由。
    正确的链接应该指向/image,如下所示:

    <img src="/image?img_id=%s"></img>
    

    我已经用我的修正测试了你的代码,它运行良好:

    from google.appengine.ext import db
    from google.appengine.api import users
    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    import logging
    
    
    class HomePage(db.Model):
        thumbnail = db.BlobProperty()
        firm_name = db.StringProperty()
    
    class ImageUpload(webapp.RequestHandler):
        def get(self):
            self.response.out.write("""
            <form action="/imagesave" enctype="multipart/form-data" method="post">
            <div><label>firm name:</label> <input type="text" name="firm_name" size=40></div>
            <div><input type="file" name="img" /></div>
            <div><input type="submit" value="Upload image"></div>
            </form>
            """)
    
    class ImageSave(webapp.RequestHandler):
        def post(self):
            homepage = HomePage()
            thumbnail = self.request.get("img")
            firm_name = self.request.get("firm_name")
            homepage.thumbnail = db.Blob(thumbnail)
            homepage.firm_name = firm_name
            homepage.put()
            self.redirect("/imageupload")
    
    class ImageResize(webapp.RequestHandler):
        def post(self):
            q = HomepageImage.all()
            q.filter("firm_name", "mta")
            qTable = q.get()
            if qTable:
                qTable.thumbnail = db.Blob(images.resize(self.request.get("img"), 32, 32))
                db.put(qTable)
            else:
                self.response.out.write("""firm not found""")
            self.redirect("/imageupload")
    
    class DisplayImage(webapp.RequestHandler):
        def get(self):
            query = HomePage.all()
            query.filter("firm_name", "mta")
            result = query.get()
            self.response.out.write("""firm name: %s""" % result.firm_name)
            self.response.out.write("""<img src="/image?img_id=%s"></img>""" %
            result.key())
    
    class Image(webapp.RequestHandler):
        def get(self):
            img_id = self.request.get("img_id")
            logging.info("""**************************img_id: %s**************************""" % img_id)
            homepage = db.get(self.request.get("img_id"))
            if homepage.thumbnail:
                    self.response.headers['Content-Type'] = "image/jpg"
                    self.response.out.write(homepage.thumbnail)
            else:
                    self.response.out.write("no image")
    
    
    application = webapp.WSGIApplication(
    [
    ("/imageresize",ImageResize),
    ("/imageupload", ImageUpload),
    ("/displayimage", DisplayImage),
    ("/imagesave", ImageSave),
    ("/image", Image),
    ],                                      
    debug=True
    )
    
    def main():
        run_wsgi_app(application)
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 谢谢,我进行了更改,但仍然出现相同的错误和损坏的图像链接。我用更改更新了问题。由于某种原因,图像中的“img_id”是一个空字符串。
    • 为我工作;清除数据存储,上传正确的图像并试一试。
    • 非常感谢。现在它起作用了。这是很大的帮助,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2014-06-20
    • 1970-01-01
    • 2012-02-04
    • 2018-02-16
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多