2012-02-20 52 views
7

我想生成一個zip文件並存儲在App Engine的Blobstore中。現在,我沒有從Blobstore獲取有效的zip文件。不確定問題是與壓縮,存儲,檢索或下載。生成Zip文件並存儲在GAE BlobStore

我已經基於以下問題構建了基於片段的代碼。

在Blob存儲在存儲之後,我讓用戶下載它通過應用瓶。

這是我想要做的事情的要點。

def zipit(): 
    zipstream = StringIO.StringIO() 
    zfile = zipfile.ZipFile(file=zipstream, mode='w') 
    bytes = "lorem ipsum dolor sit amet" 
    zfile.writestr('loremipsum', bytes, compress_type=zipfile.ZIP_STORED) 
    zfile.close() 
    zipstream.seek(0) 
    return zipstream.getvalue() 


zip_file = files.blobstore.create(mime_type='application/zip') 
zip_data = zipit() 

with files.open(zip_file, 'a') as f: 
    f.write(zip_data) 
files.finalize(zip_file) 
blob_key = files.blobstore.get_blob_key(zip_file) 

blob_data = blobstore.BlobReader(blob_key).read() 

# http://flask.pocoo.org/docs/api/ 
response = make_response(blob_data) 
response.headers['Content-Type'] = 'application/zip' 
response.headers['Content-Disposition'] = 'attachment; filename="loremipsum.zip"' 
return response 

任何幫助,非常感謝。

回答

6

大部分代碼適用於dev_appserver.py中的webapp處理程序。我的下面的版本直接從Blobstore提供zip文件,而不是將它讀入應用實例RAM並提供服務。也許這是你的意圖?如果沒有,請繼續在代碼中查找並讀取值的問題,因爲我相信您正在Blobstore中創建一個有效的Zip文件。

#!/usr/bin/env python 

import StringIO 
import zipfile 
from google.appengine.api import files 
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 util 

def zipit(): 
    zipstream = StringIO.StringIO() 
    zfile = zipfile.ZipFile(file=zipstream, mode='w') 
    bytes = "lorem ipsum dolor sit amet" 
    zfile.writestr('loremipsum', bytes, compress_type=zipfile.ZIP_STORED) 
    zfile.close() 
    zipstream.seek(0) 
    return zipstream.getvalue() 

class MainHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self): 
     k = self.request.get('key') 
     if k: 
      self.send_blob(k) 
      return 

     zip_file = files.blobstore.create(mime_type='application/zip') 
     zip_data = zipit() 

     with files.open(zip_file, 'a') as f: 
      f.write(zip_data) 
     files.finalize(zip_file) 
     blob_key = files.blobstore.get_blob_key(zip_file) 

     self.response.out.write('<a href="/getzip?key=%s">get zip</a>' % blob_key) 


application = webapp.WSGIApplication([('/getzip', MainHandler)]) 

def main(): 
    util.run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 
+0

謝謝!你的代碼有效。在檢索過程中可能會損壞。該程序建立在Flask上,這就是爲什麼我閱讀文件並提供服務的原因。我試過send_blob,但它需要頭文件可用。我將不得不找到一些解決方法來直接通過Flask框架來提供blob文件。 – 2012-02-21 04:46:32

+0

看起來這是誰處理這些URL的問題。對於blobstore中的圖像,有get_serving_url。我還沒有找到如何通過Flask從blobstore提供文件。 – 2012-02-21 09:57:17

+0

另一個步驟。 012.回到頁首'response.headers ['Content-Type'] ='application/zip'' 'response.headers ['X-AppEngine-BlobKey'] = blob_key' 'response.headers ['Content-Type'] ='application/zip'' 'response.headers ['Content-Disposition'] ='附件; filename =「loremipsum.zip」'' 'return response' 但是這並不能解決原來的問題! – 2012-02-21 17:06:19