2012-03-26 42 views
0

我創建的zip文件到GAE Blob存儲區,然後我嘗試使用此代碼來獲取(下載)該zip文件:Send_blob在GAE

def send_blob(blob_key_or_info, content_type=None, save_as=None): 

    CONTENT_DISPOSITION_FORMAT = "attachment; filename=\"%s\"" 

    if isinstance(blob_key_or_info, blobstore.BlobInfo): 
     blob_key = blob_key_or_info.key() 
     blob_info = blob_key_or_info 
    else: 
     blob_key = blob_key_or_info 
     blob_info = None 
    if blob_info: 
     content_type = content_type or mime_type(blob_info.filename) 
     save_as = save_as or blob_info.filename 
     #print save_as 
    logging.debug(blob_info) 
    response = Response() 
    response.headers[blobstore.BLOB_KEY_HEADER] = str(blob_key) 
    if content_type: 
     if isinstance(content_type, unicode): 
      content_type = content_type.encode("utf-8") 
     response.headers["Content-Type"] = content_type 
    else: 
     del response.headers["Content-Type"] 

    def send_attachment(filename): 
     if isinstance(filename, unicode): 
      filename = filename.encode("utf-8") 
     response.headers["Content-Disposition"] = (\ 
      CONTENT_DISPOSITION_FORMAT % filename) 
    if save_as: 
     if isinstance(save_as, basestring): 
      send_attachment(save_as) 
     elif blob_info and save_as is True: 
      send_attachment(blob_info.filename) 
     else: 
      if not blob_info: 
       raise ValueError("Expected BlobInfo value for blob_key_or_info.") 
      else: 
       raise ValueError("Unexpected value for save_as") 
    return response 

,如果我調用這個函數的主要和打印返回從這個功能(響應)的返回值i得到例如: 200 OK 的Content-Length:0 X-AppEngine上-的BlobKey:C25nn_O04JT0r8kwHeabDw == 內容類型:應用程序/壓縮 內容處置:附件;文件名=「test.zip」 但問題我現在如何使用此響應來獲取文件到我的電腦(下載它)? 在此先感謝。

回答

3

您需要實現一個Blobstore下載處理程序來提供該文件。例如:

from google.appengine.ext.webapp import blobstore_handlers 

class ServeZip(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self): 
    blob_key = self.request.get('key') 
    if not blobstore.get(blob_key): 
     logging.info('blobstore.get(%s) failed' % blob_key) 
     self.error(404) 
     return 

    self.send_blob(blob_key) 
    return 

然後在客戶端上你會打電話:http://yourapp.appspot.com/servezip?key=<your_url_encoded_blob_key>

對於上面的例子:http://yourapp.appspot.com/servezip?key=C25nn_O04JT0r8kwHeabDw%3D%3D

+0

:當我把在單獨的頁面該類處理器再通過鑰匙。 ,問題是:Status:404 Not Found Content-Type:text/html; charset = utf-8 Cache-Control:no-cache 到期時間:1990年1月1日星期五00:00:00 GMT Content-Length:0,處理程序沒有執行。對這個問題有什麼想法? – 2012-03-27 10:06:28

+0

你在日誌中看到'blobstore.get(...)失敗'錯誤嗎?如果是這樣,您可能傳遞了錯誤的密鑰或無法對密鑰進行正確的URL編碼。如果沒有,你可能沒有在app.yaml中正確添加處理程序。 – 2012-04-09 06:18:34

2

那麼谷歌提供了很好的API來處理Blob存儲的對象,主要是兩個名爲Clsses爲BlobstoreDownloadHandler和BlobstoreUploadHandler。

要下載內容嘗試使用BlobstoreDownloadHandler和下面的代碼可以幫助您瞭解這個概念。

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

    class VideoDownloadHelper(blobstore_handlers.BlobstoreDownloadHandler): 
     def get(self, blobkey): 
      blobKey = BlobKey(blobkey) 
      #content_type is optional and by default it is same as uploaded content's content-type. 
      self.send_blob(blobKey, content_type="image/jpeg") 

而且這種方法可以使用像

app = webapp2.WSGIApplication([(r'/download-video/([^\.]+)', VideoDownloadHandler)]) 

如需進一步閱讀,你可以通過這個 https://cloud.google.com/appengine/docs/python/blobstore/