【问题标题】:Serving Images with Google app engine使用 Google 应用引擎提供图片
【发布时间】:2013-04-30 17:07:35
【问题描述】:

我正在尝试这样做,以便当有人(成功)上传图片时,它会重定向到显示上传图片的永久链接。这是我到目前为止所尝试的。

import webapp2
import os
import re
import jinja2
from google.appengine.api import images
from google.appengine.ext import db

template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env= jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape = True, extensions=['jinja2.ext.autoescape'])
PAGE_RE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'

def render_str(template, **params):
    t = jinja_env.get_template(template)
    return t.render(params)

class BaseHandler(webapp2.RequestHandler):
    def render(self, template, **kw):
        self.response.out.write(render_str(template, **kw))

    def render_str(self, template, **params):
        params['user'] = self.user
        return render_str(template, **params)

    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)

class ImageModel(db.Model):
    patient_id = db.IntegerProperty(required = True)
    patient_image = db.BlobProperty(required = True)
class NewImageHandler(BaseHandler):
    def get(self):
        self.render('newimage.html')

    def post(self):
        patient_id = int(self.request.get('patient_id'))
        patient_image = self.request.POST.get('patient_image').file.read()
        img = str(images.Image(patient_image))
        i = ImageModel(patient_id = patient_id, patient_image = db.Blob(img))
        i.put()
        self.redirect('imageanalysis/%s'  % str(i.key().id()) )

class ImageAnalysisHandler(BaseHandler):
    def get(self, image_id):
        key = db.Key.from_path('ImageModel', int(image_id))
        imageD= db.get(key)
        self.render('imageAnalysis.html', imageD = imageD, image_key = imageD.key())

app = webapp2.WSGIApplication([
  ('/newimage', NewImageHandler),
  ('/imageanalysis/([0-9]+)', ImageAnalysisHandler),

], debug=True)

这是我的“newimage.html”表单的样子:

<form method = "post" enctype="multipart/form-data" action = "/newimage">
<input type="text"name="patient_id" value = {{patient_id}} >
<input type="file" name="patient_image">
<input type="submit" style="width: 100px" 1000px value="Submit">

这是用于“图像分析”的 HTML

<div>{{imageD.patient_id}}</div>
<div>{{imageD.key()}}
<img src='/{{image_key}}'>
</div>

它可以渲染页面并显示patient_id,但它不能显示图像。有人可以向我解释如何动态提供图像。我已经尝试了文档中的许多内容,但它不起作用。

【问题讨论】:

    标签: google-app-engine python-2.7 google-cloud-datastore jinja2


    【解决方案1】:

    您将数据存储中的 blob 与 blobstore 混淆了。

    您当前正在数据存储中存储 Blob。当您访问以下网址给出的网址时,您期望提供一张图片:

    <img src='/{{image_key}}'>
    

    但是,您似乎没有提供实际图像数据的处理程序。如果您将数据存储在 datstore 中,则没有免费的处理程序。您必须编写自己的 HTTP 处理程序,该处理程序将从数据存储中获取图像数据 blob、正确格式化并返回包含图像数据的 HTTP 响应。

    另一种方法是使用可以存储和提供数据的 blobstore。您必须相应地调整您的处理程序以使用 blobstore。上传 blob 后,您可以从 blobstore 中获取一个 url,从中可以直接提供您的图片。

    【讨论】:

      【解决方案2】:

      我建议使用 blobstore 来存储图像。这将使您摆脱 blob 属性对您施加的任何大小限制,并且您将免费获得服务功能。

      但是,它确实需要您以不同的方式存储图像。以下是如何实现这一目标的示例:

      import webapp2
      from google.appengine.api import files, images
      
      class ImageAPIHandler(webapp2.RequestHandler):
        def post(self):
          image = self.request.POST.get('image')
      
          blob = files.blobstore.create(
            mime_type='image/jpeg',
            _blobinfo_uploaded_filename=image.filename,
          )
          with files.open(blob, 'a') as f:
            f.write(image.file.read())
          files.finalize(blob)
          blob_key = files.blobstore.get_blob_key(blob)
      
          self.response.redirect(images.get_serving_url(blob_key))
      

      请注意,这是一个未经测试的片段,来自我正在运行的项目中的各种代码位。其中可能存在一些错误,但它应该能让您大致了解如何使用 blobstore。

      祝你好运。

      【讨论】:

        【解决方案3】:

        查看文档示例中的 ServeHandler。您可能想要使用 send_blob。

        https://developers.google.com/appengine/docs/python/blobstore/overview#Complete_Sample_App

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 2015-09-03
          • 2011-12-03
          • 2011-08-04
          • 1970-01-01
          • 2013-04-03
          • 2011-12-10
          相关资源
          最近更新 更多