2012-10-29 33 views
0

谷歌关于动态提供GAE图像的说明在这里:https://developers.google.com/appengine/articles/python/serving_dynamic_images 唯一的问题是,这种方法不使用AJAX,我不认为它是如我所期望的那样高效。基于AJAX的动态图像服务 - 谷歌App Engine Python 2.7

我正在尝试使用AJAX和GAE Python 2.7来动态地为多个图像提供服务,但我现在专注于为其中一个服务。

Python的服务器端代码:

class GetImage(webapp2.RequestHandler): 
    def get(self): 
     problem = Problem.all()[0] 
     if(problem and problem.prompt_image): 
      self.response.headers['Content-Type'] = "image/png" 
      self.response.out.write(problem.prompt_image) 

客户端AJAX代码:

$.ajax({ 
    url: "/img", 
    type: "POST", 
    dataType: "html", 
    success: function(msg){ 
     $("#right").append("<img>"+msg+"</img>"); 
    } 
}); 

,我现在面临的问题是,我不知道如何通过AJAX服务Blob存储内容DOM。任何人都可以将我指向正确的方向吗?

谢谢!

编辑:voscausa的解决方案似乎是在正确的轨道上。但是,它需要一个blob_key。我的模型如下:

class Problem(db.Model): 
    prompt_image = db.BlobProperty() 

我似乎无法弄清楚如何从db.BlobProperty获取Blob密钥。这可能吗?

+0

你需要做一个POST? –

+0

您是否需要在浏览器中查看它,或者您需要下载它。 –

+0

@Peter在整个系统中,用户会按下一个按钮,这会触发一个AJAX事件。由于那时候,页面已经被加载了,我觉得POST是合适的。 –

回答

1

这个问题给了我一个真正的头痛。感谢大家,尤其是voscausa,他们让我走上了寻求解决方案的正确道路。有很多旧料在那里,这是我使用的解决方案: https://developers.google.com/appengine/docs/python/blobstore/overview#Uploading_a_Blob (见完整的示例应用程序)

import os 
import urllib 
import webapp2 

from google.appengine.ext import blobstore 
from google.appengine.ext.webapp import blobstore_handlers 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
    upload_url = blobstore.create_upload_url('/upload') 
    self.response.out.write('<html><body>') 
    self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url) 
    self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit" 
     name="submit" value="Submit"> </form></body></html>""") 

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
    upload_files = self.get_uploads('file') # 'file' is file upload field in the form 
    blob_info = upload_files[0] 
    self.redirect('/serve/%s' % blob_info.key()) 

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, resource): 
    resource = str(urllib.unquote(resource)) 
    blob_info = blobstore.BlobInfo.get(resource) 
    self.send_blob(blob_info) 

app = webapp2.WSGIApplication([('/', MainHandler), 
           ('/upload', UploadHandler), 
           ('/serve/([^/]+)?', ServeHandler)], 
           debug=True) 
1

为了从Blob存储服务的图像与GET:

http://{{ your_appid }}.appspot.com/imgserve/{{ blob_key }} 

代码从Blob存储服务形象:

class ImgServe(blobstore_handlers.BlobstoreDownloadHandler): 

    def get(self, blob_key):          

    blob_info = blobstore.BlobInfo.get(blob_key)  
    self.send_blob(blob_info, save_as=True) 


app = webapp2.WSGIApplication(
          [ 
          ('/imgserve/([^/]+)?', ImgServe), 
          ], debug=True) 
+0

voscausa,感谢您的快速回复。我对你的回答有点困惑。根据我的理解,当用户想要获取图像时,我可以让我的JQuery JS进行AJAX调用,然后获取返回的数据并将其显示在页面上。看来你的解决方案需要用户导航到一个URL。 –

+0

用你的话来解释一下:一个AJAX GET就像导航到一个url。网页中的图片网址是图片GET =转到显示图片的网址。和some_text:在网页中显示图像。 – voscausa

+0

用你的话来解释它:一个AJAX GET就像导航到一个url,它返回的图像。网页中的图片网址是图片GET =转到网址,它显示/返回图片。和some_text:在网页上显示图片 – voscausa