Montag, 15. August 2011

Bottle: Dateinamen für dynamisch generierte PDFs übertragen

Ich habe diverse Python-basierte Webapplikation für das Firmenintranet programmiert, die PDFs (mittels ReportLab) generieren. Die PDFs schreiben ich dabei in ein StringIO-Objekt anstatt die Datei temporär auf Platte zu legen. Funktioniert auch alles soweit gut.

Das einzige "Problem" war, dass der Name des PDF nicht übertragen wurde, d.h. wenn man die Datei im Browser öffnet und dann speichern will schlagen Evince, Adobe Reader & Co. als Dateiname immer "pdf.pdf" (oder so ähnlich) vor. Nun gut, nicht wirklich tragisch, aber ein bisschen doof ist das trotzdem.

Die Lösung für das Problem ist dabei aber denkbar einfach - man muss nur von Hand den passende Eintrag im Response-Header setzen. Im Falle von Bottle, meinem aktuell favorisierten Webframework, sieht das so aus:


from bottle import response, ...
...
#Buffer-Objekt anlegen
buf = cStringIO.StringIO()
#hier kommt der Pythoncode zur PDF Generierung
...
#Senden vorbereiten
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment;filename={0}'.format(pdf_filename)
#und Senden
return  buf

Wie gesagt, sehr einfach. "pdf_filename" enthält dabei den eigentlichen Dateinamen. Funktioniert natürlich auch genau so mit allen anderen Dateitypen.

Keine Kommentare:

Kommentar veröffentlichen