使用Google应用引擎投放图片

时间:2013-04-30 17:07:35

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

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

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">

这是'imageanalysis

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

能够渲染页面并显示patient_id,但无法显示图像。有人可以向我解释我如何动态地提供图像。我在文档中尝试了很多东西,但它不起作用。

3 个答案:

答案 0 :(得分:2)

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

您当前正在数据存储区中存储blob。您希望在访问以下网址时提供图像:

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

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

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

答案 1 :(得分:2)

我建议使用blobstore来存储图像。这将使您免受blobproperty强加给您的任何大小限制,您将免费获得服务功能。

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

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。

祝你好运。

答案 2 :(得分:0)

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

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