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

下面是「圖像分析

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

它能夠呈現HTML頁面並顯示patient_id,但無法顯示圖像。有人可以向我解釋我如何動態地提供圖像。我已經在文檔中嘗試了很多東西,但它不起作用。

回答

2

你在與Blob存儲區進行數據存儲混亂斑點。

您當前正在將數據存儲在您的數據存儲中。你希望當您訪問所給予的URL送達的圖像:

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

但是,你似乎不有,可供實際圖像數據的處理。如果您要將數據存儲在數據存儲中,則沒有空閒處理程序。您必須編寫自己的HTTP處理程序,它將從數據存儲區獲取圖像數據Blob,並對其進行正確格式化,並返回包含圖像數據的HTTP響應。

另一種方法是使用可以存儲和提供數據的blobstore。您必須相應地調整您的處理程序才能使用Blobstore。在blob上傳後,您可以從blobstore中獲取可直接提供圖像的url。

+0

謝謝澄清! – piyushg91 2013-05-01 18:48:25

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

請注意,這是我正在直播一個項目從各種來源codebits一個未經考驗的文檔片斷。它可能有一些錯誤,但它應該給你關於如何使用blobstore的一般想法。

祝你好運。