2012-02-20 11 views
7

Próbuję wygenerować plik zip i przechowywać w Blobstore App Engine. W tej chwili nie mam prawidłowego pliku zip z Blobstore. Nie masz pewności, czy problem dotyczy zip, przechowywania, pobierania lub pobierania.Generowanie plików zip i magazynu w GAE BlobStore

Zbudowałem kod na podstawie fragmentów z poniższych pytań.

Po zapisaniu w Blobstore, mogę pozwolić użytkownikom pobrać go za pośrednictwem aplikacji kolby.

Oto sedno tego, co próbuję zrobić.

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 

Każda pomoc jest doceniana.

Odpowiedz

6

Większość kodu działa dla mnie w webapperze w dev_appserver.py. Moja wersja poniżej służy plikowi zip bezpośrednio z Blobstore, w przeciwieństwie do próby odczytu go do RAM aplikacji i obsługiwać go. Może to jest to, co zamierzałeś? Jeśli nie, kontynuuj szukanie problemu w kodzie, który odczytuje i podaje wartość, ponieważ uważam, że tworzysz prawidłowy plik Zip w 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

Dzięki! Twój kod działa. Prawdopodobnie ulega uszkodzeniu podczas pobierania. Program jest zbudowany na Flasku i to jest powód, dla którego czytam plik i służę. Próbowałem send_blob, ale wymaga to dostępności nagłówków. Będę musiał znaleźć sposób obejścia pliku blob bezpośrednio przez framework Flask. –

+0

Wygląda na to, że jest to problem związany z obsługą adresów URL. W przypadku obrazów w blobstore istnieje get_serving_url. Jeszcze nie mogę się dowiedzieć, jak wysyłać pliki z blobstore za pośrednictwem Flask. –

+0

Kolejny krok. 'odpowiedzi = make_response()' 'response.headers [ 'X AppEngine-BlobKey'] = blob_key' ' response.headers [Content-Type "] =„application/zip'' 'response.headers ['Content-Disposition'] = 'załącznik; filename = "loremipsum.zip" '' ' odpowiedź zwrotna ' Ale to jeszcze nie rozwiązuje pierwotnego problemu! –

Powiązane problemy