【问题标题】:Why does this image not displaying (broken image icon)?为什么此图像不显示(损坏的图像图标)?
【发布时间】:2011-10-06 08:48:46
【问题描述】:

我正在尝试使用下面的DisplayImage 处理程序显示我保存到数据存储区的图像,但我只看到一个损坏的图像链接。你知道为什么吗?谢谢!

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>""" %
        result.key())
...

【问题讨论】:

  • 负责实际显示图像的代码在哪里?
  • 嗨,我以为这显示了图像:self.response.out.write("""&lt;img src="img?img_id=%s"&gt;&lt;/img&gt;""" % result.key()) 我错过了什么?谢谢。
  • 这将在您的 HTML 中创建一个图像标记,其来源是图像的键。您是否有任何代码可以在该 URL 上提供图像?
  • 是的,在阅读了您的第一条评论后,我添加了一个 Image 处理程序,我认为这是提供图像的代码。我用更新的代码问了一个新问题:stackoverflow.com/questions/7546825/…。再次感谢!
  • 这个问题还有效吗?

标签: python image google-app-engine


【解决方案1】:

要从 blobstore 提供图像,请使用 get_serving_url,或者如果您有 blobproperty,您可以查看我的旧代码,该代码用于在没有 blobstore 之前从图像类提供我的 blobproperties:

class Image(db.Model):
    name        = db.StringProperty()
    desc        = db.StringProperty()
    owner       = db.UserProperty()
    secret      = db.StringProperty()
    full        = db.BlobProperty()
    full_ext    = db.StringProperty()
    small       = db.BlobProperty()
    small_ext   = db.StringProperty()
    thumb       = db.BlobProperty()
    thumb_ext   = db.StringProperty()
    published   = db.BooleanProperty()
    added       = db.DateTimeProperty(auto_now_add=True)
    modified    = db.DateTimeProperty(auto_now=True)

    def thumb_name(self):
        return '%s.%s' % (self.key(), self.thumb_ext)
    def small_name(self):
        return '%s_small.%s' % (self.key(), self.small_ext)
    def full_name(self):
        return '%s_full.%s' % (self.key(), self.full_ext)



class UploadImage(webapp.RequestHandler):
    def post(self, key):
        im = db.get(db.Key(key))
        if not im:
            self.error(404)
            return

        if self.request.POST['id'] != im.secret:
            self.error(400)
            return

        file_data = self.request.POST['file'].file.read()

        if self.request.POST['size'] == '100x100':
            im.thumb = file_data
            a = 'small'
        elif self.request.POST['size'] == '500x500':
            im.small = file_data
            a = 'full'

        if im.small and im.thumb:
            im.published = True
        im.save()
        logging.info("%s updated %s" % (im.key(), a) )
        self.response.out.write("ok")

mimetypes = {
    'jpeg': 'image/jpeg',
    'jpg':  'image/jpeg',
    'tiff':  'image/tiff',
    'tif':   'image/tiff',
    'gif':   'image/gif',
    'png':   'image/png',
    }

class ServeImage(webapp.RequestHandler):
    def get(self, key, sz, ext):
        im = db.get(db.Key(key))
        if not im:
            self.error(404)
            return

        if sz == '.':
            d = im.thumb
        elif sz == '_small.':
            d = im.small
        elif sz == '_full.':
            d = im.full
        else:
            raise Exception('wrong sz %r' % sz)

        if not d:
            d = im.full
        else:
            self.response.headers.add_header("Expires", "Thu, 01 Dec 2014 16:00:00 GMT")

        self.response.headers["Content-Type"] = mimetypes[ext]
        self.response.out.write(d)

【讨论】:

  • Niklas,谢谢,但我认为我的图像在数据存储中而不是在 blobstore 中?这是正确的吗?
【解决方案2】:

systempuntoout 在我的followup question 中回答了这个问题。他注意到我将图像源指向了一个未定义的错误 img 路由。

正确的链接应该指向 /image,如下所示:

&lt;img src="/image?img_id=%s"&gt;&lt;/img>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 2013-08-04
    • 1970-01-01
    • 2010-12-14
    • 2013-09-13
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多