1

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

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,但无法显示图像。有人可以向我解释如何动态提供图像。我已经尝试了文档中的许多内容,但它不起作用。

4

3 回答 3

2

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

您当前正在数据存储中存储 Blob。当您访问由以下内容提供的 url 时,您期望提供图像:

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

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

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

于 2013-04-30T20:34:23.993 回答
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。

祝你好运。

于 2013-05-01T19:09:21.573 回答
0

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

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

于 2013-04-30T19:18:26.827 回答