Dateien zum Download anbieten – request.sendfile()
<a href="http://my-server/downloads/my-file.txt">my-file</a>
Dies ist sicherlich nicht der Weisheit letzter Schluß, Dateien auf einer Webseite zum Download anzubieten.
Dateien schützen
Oft möchte man Dateien nur spezifischen Nutzern zugänglich machen. Dafür bietet es sich an, die Dateien gar nicht erst in einem dem Apache zugänglichen Verzeichnis abzulegen. Der versehentliche Zugriff ist damit vermieden. Um dennoch Zugriff zu gewähren, bietet mod_python im Request-Object die sendfile() Methode. Bevor wir die Datei verschicken, setzten wir im Header noch einen richtigen Dateinamen.
def sendfile(req, file): req.content_type = "text/file" req.headers_out['Content-Disposition'] = 'attachment; filename=%s' %file req.sendfile(os.path.join('path-to-file', file)) return
Eine Überprüfung und Zuordnung des Dateinamens kann natürlich noch wesentlich ausführlicher erfolgen. Der Abruf der Datei kann nun via GET erfolgen.
<a href="http://my-server/mypython.py/sendfile?file=my-file.txt">my-file.txt</a>
Zusammenbauen der Datei – Temporäre Dateien
Ich fand mich letztens vor der Aufgabe einem angemeldeten Nutzer Dateien aus einem Subversion Repository via Webservice zur Verfügung zu stellen. Dabei musste eine ausgewählte Datei über ein python Modul (in diesem Fall pysvn) exportiert werden und anschließend versand werden. Mit dem Modul tempfile konnte ich damit Datei-Müll auf meinem Sever vermeiden.
from __future__ import with_statement #has to be at the beginning of the file import tempfile def sendFile(req, key, file): with tempfile.NamedTemporaryFile('w+b') as f: #get file, e.g.: f.write(data) req.content_type = "text/file" req.headers_out['Content-Disposition'] = 'attachment; filename=%s' %file req.sendfile(f.name) return
Wichtig: Die temporäre Datei wird erst nach file.close() gelöscht. Mit dem with statement kann dies realisiert werden. Wir haben innerhalb der Anweisung freie Auswahl auf die Methoden des Datei Objekts. Nicht nur über file.write() sondern auch über den Zugriff auf den temporären Pfad, file.name, können wir die Datei beschreiben und auch wieder auslesen. Nach dem Versand verschwindet die Datei wieder sauber, ohne dass wir uns Gedanken machen müssen.
About the Author
Computer sollen uns in Beruf und Alltag unterstützen. Damit das funktioniert müssen wir einen einfachen und intuitiven Zugang zu unseren Programmen, Daten und Systemen haben.