2012-02-20 10 views
7

Sto cercando di generare un file zip e archiviarlo in Blobstore di App Engine. Al momento, non ottengo un file zip valido da Blobstore. Non sei sicuro che il problema sia con lo zip, la memorizzazione, il recupero o il download.Genera file zip e archivia in GAE BlobStore

Ho creato il codice basato su snippet dalle seguenti domande.

Dopo aver memorizzato nel blobstore, lascio agli utenti di scaricare attraverso un'applicazione Flask.

Ecco l'essenza di ciò che sto cercando di fare.

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 

Qualsiasi aiuto è molto apprezzato.

risposta

6

Gran parte del codice funziona per me in un gestore di app Web in dev_appserver.py. La mia versione di seguito serve il file zip direttamente da Blobstore, a differenza di provare a leggerlo nella RAM di istanza dell'applicazione e a servirlo. Forse è questo che intendevi? In caso contrario, continua a cercare il problema nel codice che legge e fornisce il valore, perché credo che stai creando un file Zip valido nel 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

Grazie! Il tuo codice funziona. Probabilmente si sta corrompendo durante il recupero. Il programma è costruito su Flask, e questa è la ragione, perché leggo il file e lo servo. Ho provato send_blob, ma richiede che le intestazioni siano disponibili. Dovrò trovare qualche soluzione alternativa per servire il file blob direttamente attraverso il framework Flask. –

+0

Sembra che questo sia un problema di chi riesce a gestire gli URL. Per le immagini in blobstore c'è get_serving_url. Devo ancora scoprire come servire i file da blobstore, attraverso Flask. –

+0

Un altro passaggio. 'risposta = make_response()' ' response.headers [ 'X-AppEngine-BlobKey'] = blob_key' ' response.headers [ 'Content-Type'] = 'application/zip'' 'response.headers ['Content-Disposition'] = 'allegato; filename = "loremipsum.zip" '' ' return response' Ma questo non risolve ancora il problema originale! –

Problemi correlati