4. März 2013 | 2 min lesezeit

Rechtsklick -> Datei speichern unter

In diesem kurzen Blogeintrag geht es darum einen Download von dynamisch erstellten Dateien mittels PrettyFaces zu realisieren. Häufige und durchaus naheliegende richtige Lösungen von solchen Datei-Downloads basieren entweder auf purem JSF oder werden mittels entsprechender PrimeFaces-Komponente realisiert. Beides funktioniert an sich wunderbar, hat jedoch einen – für den Endanwender unfreundlichen – Nachteil: „Rechtsklick -> Datei speichern unter“ führt nicht zum Download der gewünschten Datei.

Der Download von dynamisch bereitzustellenden Dateien erfolgt im Rahmen von JSF in der Regel durch den Aufruf einer Methode aus der Bean, welche die gewünschte Datei als Byte-Array verpackt in einer HttpServletResponse zurückgibt (komplettes Beispiel siehe hier).

Wie es NICHT geht

Kurz zwei Code-Beispiele, wie der Download von einem JSF-Entwickler normalerweise realisiert werden würde.

Mit purem JSF sieht ein Download-Link ungefähr so aus:

Mit PrimeFaces würde die Bean-Methode zwar etwas anders aussehen, aber das Prinzip ist letztendlich sehr ähnlich (komplettes Beispiel siehe hier):

Beide Lösungen führen zu einem erfolgreichen Download bei einem Linksklick oder auch per Return-Taste) und in diesem Beispiel würde die Datei „helloworld.pdf“ direkt heruntergeladen werden. Möchte der Anwender den Download allerdings mit „Rechtsklick -> Datei speichern unter“ durchführen, so würde lediglich die aktuell angezeigte Webseite als HTML-Datei heruntergeladen werden.

Technisch liegt das geschilderte Fehlverhalten daran, dass der Download bei den obigen Beispielen per JavaScript und POST-Request ausgelöst wird. Um den Download mittels Rechtsklick über das normale Kontextmenü zu ermöglichen brauchen wir allerdings einen GET-Request.

So geht’s

Um das gewünschte Download-Verhalten zu implementieren eignet sich PrettyFaces. Wie der Name schon fast sagt, kann man mit dem Framework „schöne“ URLs erzeugen.

Kurz konfiguriert lässt sich der Datei-Download per GET-Request durch ein Stückchen JSF

und entsprechende Konfiguration in der pretty-config.xml

umsetzen.

Das war’s auch schon. Ein komplettes lauffähiges Beispiel gibt’s hier.

Quellen


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH
Poststraße 1
26122 Oldenburg