2012-02-20 35 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