2009-02-24 13 views
19

Ich habe ein kleines Projekt, das perfekt für Google App Engine wäre. Die Implementierung hängt von der Fähigkeit ab, eine ZIP-Datei zu erzeugen und sie zurückzugeben.Kann eine ZIP-Datei mit App Engine generiert und zurückgegeben werden?

Aufgrund der verteilten Natur von App Engine, von dem, was ich sagen kann, konnte die ZIP-Datei nicht im traditionellen Sinne "In-Memory" erstellt werden. Es müsste grundsätzlich generiert und in einem einzigen Anfrage/Antwort-Zyklus gesendet werden.

Ist das Python-Zip-Modul überhaupt in der App Engine-Umgebung vorhanden?

Antwort

32

zipfile bei appengine verfügbar ist und überarbeitet example folgt:

from contextlib import closing 
from zipfile import ZipFile, ZIP_DEFLATED 

from google.appengine.ext import webapp 
from google.appengine.api import urlfetch 

def addResource(zfile, url, fname): 
    # get the contents  
    contents = urlfetch.fetch(url).content 
    # write the contents to the zip file 
    zfile.writestr(fname, contents) 

class OutZipfile(webapp.RequestHandler): 
    def get(self): 
     # Set up headers for browser to correctly recognize ZIP file 
     self.response.headers['Content-Type'] ='application/zip' 
     self.response.headers['Content-Disposition'] = \ 
      'attachment; filename="outfile.zip"'  

     # compress files and emit them directly to HTTP response stream 
     with closing(ZipFile(self.response.out, "w", ZIP_DEFLATED)) as outfile: 
      # repeat this for every URL that should be added to the zipfile 
      addResource(outfile, 
       'https://www.google.com/intl/en/policies/privacy/', 
       'privacy.html') 
      addResource(outfile, 
       'https://www.google.com/intl/en/policies/terms/', 
       'terms.html') 
+1

Halten Die Größe der Antwortgröße in App Engine ist 10 MB, daher können Sie keine ZIP-Datei größer als diese zurückgeben.Möglicherweise können Sie mithilfe der neuen Datei-API (SDK 1.4.3) die ZIP-Datei erstellen, im Blobstore speichern und dann die Datei zurückgeben Blob. –

+0

Diese Antwort schlägt bei 'buf = zipf.read (2048)' fehl, es gibt keine frühere Referenz "Zipf"; Verwenden Sie die Antwort unter – Justin

+0

@Justin: Aktualisierter Beispielcode sollte besser funktionieren. – myroslav

2

Von What is Google App Engine:

You can upload other third-party libraries with your application, as long as they are implemented in pure Python and do not require any unsupported standard library modules.

Also, auch wenn es nicht standardmäßig vorhanden ist können Sie (potentiell) umfassen it yourself. . (Ich sage möglicherweise, weil ich weiß nicht, ob die Python Zip-Bibliothek alle "nicht unterstützte Standard-Bibliothek-Module" erfordert

9
import zipfile 
import StringIO 

text = u"ABCDEFGHIJKLMNOPQRSTUVWXYVabcdefghijklmnopqqstuvweyxáéöüï东 廣 広 广 國 国 国 界" 

zipstream=StringIO.StringIO() 
file = zipfile.ZipFile(file=zipstream,compression=zipfile.ZIP_DEFLATED,mode="w") 
file.writestr("data.txt.zip",text.encode("utf-8")) 
file.close() 
zipstream.seek(0) 
self.response.headers['Content-Type'] ='application/zip' 
self.response.headers['Content-Disposition'] = 'attachment; filename="data.txt.zip"' 
self.response.out.write(zipstream.getvalue())