2009-02-24 10 views
19

Google App Engineには最適な小さなプロジェクトがあります。これを実装するには、ZIPファイルを生成して返す機能が必要です。App EngineでZIPファイルを生成して返すことはできますか?

App Engineの分散した性質のため、私が知る限り、ZIPファイルは従来の意味で「メモリ内」に作成できませんでした。基本的に生成され、単一の要求/応答サイクルで送信される必要があります。

Python zipモジュールはApp Engine環境にも存在しますか? What is Google App Engineから

答えて

32

zipfileはAppEngineのに利用可能である可能性のを言うとexampleを再加工することは、次のとおりです。

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

キープ新しいAppFiles API(SDK 1.4.3)を使用すると、zipファイルを作成してblobstoreに格納してから、そのファイルを返すことができます。 blob。 –

+0

この回答は 'buf = zipf.read(2048)'で失敗します;以前のref 'zipf'へのエイリアス;以下の答えを – Justin

+0

@ジャスティン:更新されたサンプルコードがうまく動作するはずです。 – 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.

、それはあなたが(潜在的に)それを自分を含めることができ、デフォルトでは存在しない場合でも。 。(私は、Pythonのzipライブラリは任意の「サポートされていない標準ライブラリモジュール」を必要とする場合、私は知らないので

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()) 
関連する問題