2012-02-20 8 views
7

Estoy intentando generar un archivo zip y almacenarlo en la tienda de blobs de App Engine. En este momento, no obtengo un archivo zip válido de Blobstore. No estoy seguro de que el problema sea al comprimir, almacenar, recuperar o descargar.Generar archivos Zip y almacenarlos en GAE BlobStore

He creado el código basado en fragmentos de las siguientes preguntas.

Después de almacenar en el almacén de blob, lo que los usuarios descarguen a través de una aplicación frasco.

Aquí está la esencia de lo que estoy tratando de hacer.

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 

Cualquier ayuda es muy apreciada.

Respuesta

6

La mayor parte de tu código funciona para mí en un manejador de aplicaciones web en dev_appserver.py. Mi versión a continuación sirve el archivo zip directamente desde Blobstore, en lugar de intentar leerlo en la RAM de la instancia de la aplicación y servirlo. Quizás esto es lo que pretendías? De lo contrario, continúe buscando el problema en su código que lee y sirve el valor, porque creo que está creando un archivo Zip válido en la tienda de blob.

#!/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

Gracias! Tu código funciona Probablemente se corrompe durante la recuperación. El programa se basa en Flask, y esa es la razón por la que leo el archivo y lo sirvo. Intenté send_blob, pero requiere que los encabezados estén disponibles. Tendré que encontrar algunas soluciones para servir el archivo blob directamente a través del marco de Flask. –

+0

Parece que este es un problema de quién maneja las URL. Para las imágenes en blobstore hay get_serving_url. Todavía tengo que averiguar cómo publicar archivos desde blobstore, a través de Flask. –

+0

Otro paso. 'respuesta = make_response()' ' response.headers [ 'X-AppEngine-BlobKey'] = blob_key' ' response.headers [ 'Content-Type'] = 'application/zip'' 'response.headers ['Content-Disposition'] = 'archivo adjunto; filename = "loremipsum.zip" '' ' return response' ¡Pero esto no resuelve el problema original todavía! –

Cuestiones relacionadas