2009-02-24 6 views
19

Ho un piccolo progetto che sarebbe perfetto per Google App Engine. L'implementazione dipende dalla capacità di generare un file ZIP e di restituirlo.È possibile generare e restituire un file ZIP con App Engine?

A causa della natura distribuita di App Engine, da quello che posso dire, il file ZIP non può essere creato "in memoria" nel senso tradizionale. Dovrebbe essere generato e inviato in un unico ciclo di richiesta/risposta.

Il modulo zip Python esiste anche nell'ambiente App Engine?

risposta

32

zipfile è disponibile a AppEngine e rielaborato example segue:

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

Tenere il limite di dimensioni della risposta su App Engine è 10 MB, quindi non è possibile restituire un file zip più grande di quello. Forse utilizzando la nuova API File (SDK 1.4.3) è possibile creare il file zip, archiviarlo nel blobstore, quindi restituire BLOB –

+0

Questa risposta non riesce a "buf = zipf.read (2048)", non c'è alcun riferimento precedente a "zipf"; usa la risposta sotto – Justin

+0

@Justin: il codice di esempio aggiornato dovrebbe funzionare meglio. – myroslav

2

Da 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.

Così, anche se non esiste di default si può (potenzialmente) comprendono da soli. . (Dico potenzialmente perché non so se la libreria Python zip richiede alcun "moduli della libreria standard non supportati"

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())