Est-il possible de générer et renvoyer un fichier ZIP avec App Engine?
-
06-09-2019 - |
Question
J'ai un petit projet qui serait parfait pour Google App Engine. Sa mise en œuvre dépend de la capacité de générer un fichier ZIP et le retourner.
En raison de la nature distribuée de App Engine, de ce que je peux dire, le fichier ZIP ne peut être créé « en mémoire » dans le sens traditionnel. Il aurait essentiellement à générer et et envoyé en une seule demande / cycle de réponse.
Le module Python zip existe même dans l'App Engine environnement?
La solution
zipfile est disponible à AppEngine et retravaillé exemple suit:
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')
Autres conseils
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())
De Qu'est-ce que Google App Engine :
Vous pouvez télécharger d'autres tiers bibliothèques avec votre application, comme tant qu'ils sont mis en œuvre dans le plus pur Python et ne nécessitent pas non pris en charge des modules de la bibliothèque standard.
Alors, même si elle n'existe pas par défaut, vous pouvez (potentiellement) inclure vous-même. (Je dis potentiellement parce que je ne sais pas si la bibliothèque zip Python nécessite des "modules de la bibliothèque standard non pris en charge".