2012-08-07 63 views
3

我已成功地使用所提供的代碼here(其中一條評論主要基於GAE文檔)將圖像上傳到我的Google App Engine Blobstore。GAE - 將圖像從移動設備上傳到blobstore

下面是參考的完整代碼:

import os 
import urllib 

from google.appengine.ext import blobstore 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import blobstore_handlers 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 

class MainHandler(webapp.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>""") 

     for b in blobstore.BlobInfo.all(): 
      self.response.out.write('<li><a href="/serve/%s' % str(b.key()) + '">' + str(b.filename) + '</a>') 

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
     upload_files = self.get_uploads('file') 
     blob_info = upload_files[0] 
     self.redirect('/') 

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, blob_key): 
     blob_key = str(urllib.unquote(blob_key)) 
     if not blobstore.get(blob_key): 
      self.error(404) 
     else: 
      self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True) 

def main(): 
    application = webapp.WSGIApplication(
      [('/', MainHandler), 
      ('/upload', UploadHandler), 
      ('/serve/([^/]+)?', ServeHandler), 
      ], debug=True) 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

然而,這種代碼要求上載URL上的GET請求包含圖像數據POST請求被創建之前:

def get(self): 
    upload_url = blobstore.create_upload_url('/upload') 

當我嘗試從移動設備發送圖像時,我想將服務器代碼壓入def post(self):函數下的一個代碼塊,並且在執行此操作時遇到問題。

將上面的代碼移動到def post(self):代碼似乎沒有辦法。

任何想法?

乾杯! Brett

回答

0

這不適用於默認的Blobstore上傳處理程序:它需要兩個請求:第一個創建一次性下載URL,第二個實際上對此URL執行POST。

如果您想一次完成所有工作,請自行創建file upload handler並使用新的Blobstore API至write files

2

是的,你可以使用urlfetch使它成爲一個單一的代碼塊。這裏是我的方法:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
     upload_files = self.get_uploads('file') 
     if len(upload_files) > 0 : 
      blob_info = upload_files[0] 
      self.response.write(str(blob_info.key())) 
     else: 
      self.error(404) 

class SomeHandler(webapp.RequestHandler): 
    def post(self): 
     file = self.request.POST.get('file') 
     if (file is not None): 
      # Use urlfetch to call to the blob upload url and get result 
      # Just copy the same request body and header and pass to UploadHandler here 
      result = urlfetch.fetch(
       url= blobstore.create_upload_url('/upload'), 
       payload=self.request.body, 
       method=urlfetch.POST, 
       headers=self.request.headers) 
      if result.status_code == 200: 
       blob_key_str = result.content 
       # Get blob key 
       blob_key = blobstore.BlobKey(blob_key_str) 
       # Maybe a url for the file 
       blob_url = images.get_serving_url(blob_key_str, 400) 

這樣你就可以隨時上傳文件SomeHandler,而不是要獲取上載URL第一則僅上傳。

希望它能幫助!

+0

嗨。此解決方案在本地主機上正常工作,但在上傳到Google服務器時不起作用。有任何想法嗎 ? – Tejas 2015-03-24 06:04:51

+0

它適用於我的情況,你必須檢查你的日誌。可能還有其他問題。 – 2015-03-24 07:37:47