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.
- Is it possible to generate and return a ZIP file with App Engine?
- Zipping dynamic files in App Engine (Python)
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.
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. –
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. –
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! –