Создание Zip-файлов и хранение в GAE BlobStore - PullRequest
7 голосов
/ 20 февраля 2012

Я пытаюсь создать zip-файл и сохранить его в Blobstore App Engine.Сейчас я не получаю действительный почтовый файл из Blobstore.Не уверен, что проблема заключается в архивировании, хранении, получении или загрузке.

Я создал код на основе фрагментов из следующих вопросов.

После сохранения в Blobstore я разрешаю пользователямскачайте его через приложение Flask.

Вот суть того, что я пытаюсь сделать.

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

Любая помощь очень ценится.

1 Ответ

6 голосов
/ 21 февраля 2012

Большая часть вашего кода работает для меня в обработчике веб-приложения в 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()
...