2016-06-29 9 views
0

Ich baue derzeit Kirsche py App für meine Projekte und bei bestimmten Funktionen brauche ich automatisch starten eine Datei herunterladen.Kirsche py Auto-Download-Datei

Nach Zip-Datei Finish Erzeugungs möchte ich Download auf Client starten So, nachdem Bilder erstellt werden, sind sie mit Reißverschluss und an den Client gesendet

class Process(object): 
    exposed = True 

    def GET(self, id, norm_all=True, format_ramp=None): 
     ... 
     def content(): #generating images 
      ... 

      def zipdir(basedir, archivename): 
       assert os.path.isdir(basedir) 
       with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z: 
        for root, dirs, files in os.walk(basedir): 
         #NOTE: ignore empty directories 
         for fn in files: 
          absfn = os.path.join(root, fn) 
          zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path 
          z.write(absfn, zfn) 

      zipdir("/data/images/8","8.zip") 

      #after zip file finish generating, I want to start downloading to client 
      #so after images are created, they are zipped and sent to client 
      #and I'm thinking do it here, but don't know how 

     return content() 

    GET._cp_config = {'response.stream': True} 


    def POST(self): 
     global proc 
     global processing 
     proc.kill() 
     processing = False 

Antwort

0

einfach ein ZIP-Archiv im Speicher erstellen und dann bringen Sie es mit file_generator() Hilfsfunktion von cherrypy.lib. Sie können auch yield HTTP-Antwort aktivieren, um Streaming-Funktionen zu aktivieren (denken Sie daran, HTTP-Header vor dem zu setzen). Ich schrieb ein einfaches Beispiel (basierend auf Ihrem Snippet) für Sie nur return in einem ganzen gepufferten Zip-Archiv.

from io import BytesIO 

import cherrypy 
from cherrypy.lib import file_generator 


class GenerateZip: 
    @cherrypy.expose 
    def archive(self, filename): 
     zip_archive = BytesIO() 
     with closed(ZipFile(zip_archive, "w", ZIP_DEFLATED)) as z: 
      for root, dirs, files in os.walk(basedir): 
       #NOTE: ignore empty directories 
       for fn in files: 
        absfn = os.path.join(root, fn) 
        zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path 
        z.write(absfn, zfn) 


     cherrypy.response.headers['Content-Type'] = (
      'application/zip' 
     ) 
     cherrypy.response.headers['Content-Disposition'] = (
      'attachment; filename={fname}.zip'.format(
       fname=filename 
      ) 
     ) 

     return file_generator(zip_archive) 

N.B. Ich habe diesen Code nicht getestet, aber die allgemeine Idee ist richtig.