2009-05-31 13 views
1

In cherrypy.lib.static.py gibt es eine Methode:serve_file für jedes Dateiobjekt

serve_file(path, content_type=None, disposition=None, name=None) 

wo das Argument "Pfad" muß echte Datei (absoluter Pfad) sein. Gibt es etwas, das einem Python-Dateiobjekt ähnlich ist?

+0

Die Funktion serve_fileobj funktioniert perfekt dafür. (Es wäre hilfreich für die Gemeinschaft, wenn Sie die richtige Antwort akzeptieren würden.) –

Antwort

3

Aus dem Studium http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py Ich würde sagen müssen, nein: die serve_file Funktion ist "monolithischen", und macht ihre eigenen bodyfile = open(path, 'rb'), noch scheint es keine Alternative zu sein. Schade, da es leicht wäre, die Funktion umzuformen und weitere hinzuzufügen, z. serve_open_file, um Ihren Fall zu decken, beide delegieren zu einer internen Funktion für die "harte" Logik wie multipart/byterange Serving. Es kann sich lohnen, eine Feature - Anfrage ("Enhancement ticket") auf cherrypy.org zu öffnen - ist vielleicht keine Killer - Funktion, aber ich kann Anwendungsfälle sehen, und die Implementierung wäre für die Cherrypy - Leute nicht schwer (siehe their site und folgen Sie den Anweisungen auf der Seite, um sich anzumelden.

+1

Wenn ich richtig verstehe, denke ich, dass diese Antwort nicht mehr wahr ist, mit der Hinzufügung der 'serve_fileobj'-Methode. –

+0

Ja, serve_filobj macht genau das, was OP will. (Diese Antwort ist veraltet.) –

2

Solange Ihre Datei oder Ihr dateiähnliches Objekt iterierbar ist, geben Sie es nur von Ihrer Handler-Funktion anstelle einer Zeichenfolge zurück.

Update:

Um es als Download zu dienen, stellen Sie die Content-Type und Content-Disposition-Header wie folgt:

cherrypy.response.headers["Content-Type"] = "application/x-download" 
cd = 'attachment; filename="%s"' % name 
cherrypy.response.headers["Content-Disposition"] = cd 

Oder verwenden Sie die serve_fileobj Funktion in aktuellen Versionen von cherrypy/lib/static.py , das tut das für dich und mehr.

+0

Dies funktioniert, wenn Sie den Dateiinhalt auf dem Bildschirm wiedergeben möchten. Gibt es eine Möglichkeit, die Datei herunterzuladen? –