Большая часть вашего кода работает для меня в обработчике веб-приложения в dev_appserver.py. Моя версия ниже предоставляет zip-файл непосредственно из Blobstore, вместо того, чтобы пытаться прочитать его в оперативной памяти экземпляра приложения и обслуживать его. Может быть, это то, что вы хотели? Если нет, продолжайте искать проблему в своем коде, который читает и обслуживает значение, потому что я считаю, что вы создаете действительный Zip-файл в Blobstore.
#!/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()