我正在尝试这样做,以便当有人上传图片(成功)时,会将其重定向到上传图片显示的永久链接。这是我到目前为止所尝试的内容。
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,但无法显示图像。有人可以向我解释我如何动态地提供图像。我在文档中尝试了很多东西,但它不起作用。
答案 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