1

다른 사람이 사진을 업로드 할 때 (성공적으로) 업로드 된 이미지가 표시된 퍼머 링크로 리디렉션되도록하려고합니다. 여기에 내가 지금까지 시도한 것들이있다.Google 앱 엔진 이미지 게재

다음
<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 페이지를 렌더링 할 수

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

에 대한 HTML입니다 : 여기

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 '에 대한 내 양식이 모습입니다 patient_id를 표시하지만 이미지를 표시 할 수는 없습니다. 누군가 내가 이미지를 동적으로 제공 할 수있는 방법을 설명 할 수 있습니까? 설명서에서 많은 부분을 시도했지만 작동하지 않습니다.

답변

2

당신은 Blob 저장소와 데이터 저장소에 모양을 혼동하고 있습니다.

현재 데이터 저장소에 얼룩을 저장하고 있습니다. 당신은 이미지가 당신에 의해 주어진 URL을 액세스 할 때 제공 될 것으로 예상하고 있습니다 :

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

그러나, 당신은 실제 이미지 데이터를 제공하는 핸들러를 갖고있는 것 같다하지 않습니다. 데이터 저장소에 데이터를 저장하는 경우 무료 핸들러가 없습니다. 데이터 저장소에서 이미지 데이터 blob을 가져 와서 제대로 포맷하고 이미지 데이터와 함께 HTTP 응답을 반환하는 고유 한 HTTP 처리기를 작성해야합니다.

다른 방법으로는 데이터를 저장하고 제공 할 수있는 blobstore를 사용하는 것입니다. blobstore를 사용하려면 핸들러를 적절하게 조정해야합니다. 얼룩이 업로드 된 후 이미지를 직접 제공 할 수있는 얼룩말에서 URL을 얻을 수 있습니다.

+0

설명해 주셔서 감사합니다. – piyushg91

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

참고이 내가 살고 실행 해요 프로젝트의 다양한 codebits에서 공급 안된 잘린인지, 다음은 당신이 달성 할 수있는 방법의 예입니다. 거기에 몇 가지 버그가있을 수 있지만, 당신에게 blobstore를 사용하는 방법에 대한 일반적인 아이디어를 제공해야합니다.

행운을 빈다.