2009-02-24 5 views
19

Mam mały projekt, który idealnie pasowałby do Google App Engine. Wdrażanie jej zależy od możliwości wygenerowania pliku ZIP i zwrócenia go.Czy można wygenerować i zwrócić plik ZIP za pomocą App Engine?

Z powodu rozproszonego charakteru App Engine, z tego, co wiem, pliku ZIP nie można było stworzyć "w pamięci" w tradycyjnym znaczeniu. Zasadniczo musi to być generowane i wysyłane w jednym cyklu żądanie/odpowiedź.

Czy moduł pocztowy Python istnieje nawet w środowisku App Engine?

Odpowiedz

32

zipfile jest dostępny na App Engine i przerobione example następująco:

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

Twierdzę mając na uwadze limit rozmiaru odpowiedzi w App Engine to 10 MB, więc nie możesz zwrócić większego pliku zip, prawdopodobnie używając nowego API plików (SDK 1.4.3), możesz utworzyć plik zip, zapisać go w blobstore, a następnie zwrócić blob. –

+0

Ta odpowiedź kończy się niepowodzeniem w 'buf = zipf.read (2048)', nie ma wcześniejszej odpowiedzi erence do "zipf"; skorzystaj z odpowiedzi poniżej: – Justin

+0

@Justin: Zaktualizowany kod przykładowy powinien działać lepiej. – myroslav

2

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

Tak więc, nawet jeśli nie istnieje domyślnie można (potencjalnie) to samodzielnie. . (Mówię potencjalnie bo nie wiem, czy biblioteka Pythona zip wymaga żadnych „nieobsługiwane moduły biblioteki standardowe”

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()) 
Powiązane problemy