我有一个小项目非常适合使用Google App Engine,但是实现它需要能够生成并返回ZIP文件。
据我所知,由于App Engine的分布式特性,ZIP文件无法以传统方式“内存中”创建。基本上必须在单个请求/响应周期中生成并发送。
Python zip模块在App Engine环境中是否存在?
我有一个小项目非常适合使用Google App Engine,但是实现它需要能够生成并返回ZIP文件。
据我所知,由于App Engine的分布式特性,ZIP文件无法以传统方式“内存中”创建。基本上必须在单个请求/响应周期中生成并发送。
Python zip模块在App Engine环境中是否存在?
在appengine上可以使用zipfile,以下是重新编写的示例:
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')
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())
您可以上传其他第三方库与您的应用程序一起使用,只要它们是用纯Python实现的并且不需要任何不支持的标准库模块。
因此,即使默认情况下不存在,您也可以(可能)自己包含它。(我说“可能”是因为我不知道Python zip库是否需要任何“不支持的标准库模块”。)
contents.encode('utf-8')
,因为这没有标准,可能会导致错误。 - Morris Fauntleroy