Google app engine 使用谷歌应用程序引擎提供图像服务

Google app engine 使用谷歌应用程序引擎提供图像服务,google-app-engine,python-2.7,google-cloud-datastore,jinja2,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') jinj

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

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>
{{imageD.patient_id}
{{imageD.key()}

它能够呈现页面并显示患者id,但不能显示图像。有人能给我解释一下我是如何动态地为图像服务的吗。我已经尝试了文档中的很多东西,但都不起作用

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


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


您将数据存储区中的Blob与Blob存储区混淆

您当前正在数据存储中存储blob。当您访问以下url时,您希望收到一个图像:

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

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


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

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

您当前正在数据存储中存储blob。当您访问以下url时,您希望收到一个图像:

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

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


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

我建议使用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))
请注意,这是一个未经测试的片段,来源于我正在运行的项目中的各种代码位。其中可能有一些bug,但它应该能让您大致了解如何使用blobstore


祝你好运。

我建议使用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))
请注意,这是一个未经测试的片段,来源于我正在运行的项目中的各种代码位。其中可能有一些bug,但它应该能让您大致了解如何使用blobstore

祝你好运