2012-02-20 2 views
7

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

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

ответ

6

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

Спасибо! Ваш код работает. Вероятно, он поврежден во время извлечения. Программа построена на Flask, и именно по этой причине я прочитал файл и подал заявку. Я попробовал send_blob, но для этого нужны заголовки. Мне нужно будет найти некоторые обходные пути, чтобы обслуживать файл blob непосредственно через флеш-фреймворк. –

+0

Похоже, что это проблема того, кто получает обработку URL-адресов. Для изображений в blobstore есть get_serving_url. Мне еще предстоит выяснить, как обслуживать файлы из blobstore через Flask. –

+0

Еще один шаг. 'ответ = make_response()' ' response.headers [ 'X-AppEngine-BlobKey'] = blob_key' ' response.headers [ 'Content-Type'] = «применение/zip'' ' response.headers ['Content-Disposition'] = 'attachment; filename = "loremipsum.zip" '' ' return response' Но это еще не решило исходную проблему! –

Смежные вопросы