2009-02-24 14 views
19

Tôi có một dự án nhỏ sẽ hoàn hảo cho Google App Engine. Thực hiện nó bản lề về khả năng tạo ra một tập tin ZIP và trả lại nó.Có thể tạo và trả lại tệp ZIP với App Engine không?

Do tính chất phân tán của App Engine, từ những gì tôi có thể nói, không thể tạo tệp ZIP "trong bộ nhớ" theo nghĩa truyền thống. Nó về cơ bản sẽ phải được tạo ra và được gửi trong một chu kỳ yêu cầu/đáp ứng đơn.

Mô-đun zip của Python có còn tồn tại trong môi trường App Engine không?

Trả lời

32

zipfile có sẵn tại appengine và làm lại example sau:

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

Giữ lưu ý giới hạn kích thước phản hồi trên App Engine là 10MB, do đó bạn không thể trả lại tệp zip lớn hơn điều đó. Có thể sử dụng API tệp mới (SDK 1.4.3), bạn có thể tạo tệp zip, lưu trữ nó trong blobstore, sau đó trả về –

+0

Câu trả lời này không thành công tại 'buf = zipf.read (2048)'; không có ref trước đó erence để 'zipf'; sử dụng câu trả lời bên dưới – Justin

+0

@Justin: Mã mẫu cập nhật phải hoạt động tốt hơn. – myroslav

2

Từ 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.

Vì vậy, ngay cả khi nó không tồn tại theo mặc định bạn có thể (khả năng) bao gồm điều đó cho mình. . (Tôi nói khả năng bởi vì tôi không biết nếu thư viện Python zip đòi hỏi bất kỳ "module thư viện chuẩn được hỗ trợ"

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