2009-02-24 18 views
19

Google App Engine için mükemmel olacak küçük bir projem var. Bir ZIP dosyası oluşturma ve döndürme yeteneği üzerine menteşeleri uygulamak.App Engine ile bir ZIP dosyası oluşturmak ve göndermek mümkün mü?

App Engine'in dağıtılmış yapısı nedeniyle, anlatabildiğim kadarıyla ZIP dosyası, geleneksel anlamda "bellekte" oluşturulamadı. Temel olarak oluşturulmalı ve tek bir istek/yanıt döngüsünde gönderilmelidir.

Python zip modülü, App Engine ortamında var mı? What is Google App Engine itibaren

cevap

32

zipfile AppEngine'de mevcuttur Python zip kütüphanesi herhangi bir "desteklenmeyen standart kütüphane modüllerini" gerektiriyorsa potansiyel bilmiyorum çünkü demek ve yeniden bir çalışma example aşağıdaki gibidir:

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

Keep App Engine'deki yanıt boyutu sınırının 10MB olduğu düşünülürse, bundan daha büyük bir zip dosyası döndüremezsiniz. Belki de yeni Dosyalar API'sini (SDK 1.4.3) kullanarak zip dosyasını oluşturabilir, blobstore'da saklayabilir, ardından blob –

+0

Bu cevap 'buf = zipf.read (2048)' aşamasında başarısız oluyor; 'zipf' için erence; – Justin

+0

@Justin'in altındaki cevabı kullan: Güncellenen örnek kod daha iyi çalışıyor olmalı. – myroslav

2

:

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.

Yani, varsayılan olarak yok olsa bile (potansiyel olarak) kendiniz dahil edebilirsiniz. . (Ben

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()) 
İlgili konular