Pdf in Ajax-request Response anzeigen/laden

Hallo,

Nachdem der Client einen Ajax Request gesendet hat, erstelle ich eine Pdf mittels Mpdf, welches ich dann in der anwesenden (Enlight_Controller_Response_ResponseHttp) response printe.

Es sieht so aus:

$mpdf = new Mpdf();
$response = $this->Response();
$response->setHeader('Content-disposition', 'attachment;' . 'filename="test.pdf"');
$response->setHeader('Content-Type', 'application/pdf');
            
$this->makePdf($mpdf);
echo($mpdf->Output());

Nun ist die pdf beim Client in der responseText im Ajax request da, etwa so: responseText: “%PDF-1.4↵%����↵3…” (langer String).

Meiner Recherchen nach sollten diese http Header dafür sorgen, dass im Browser automatisch der Download der pdf Datei “test.pdf” startet, samt Inhalt des responseText.

Es passiert aber nichts.  An mpdf liegt as nicht, ich habe es schon eine Datei im Server schreiben lassen und die Pdf war korrekt. 

Viele Grüße

Die Header wirken beim Ajax Request nicht. Du brauchst aber auch keinen Ajax Request machen. Mach einfach nen ganz normalen Link oder setz window.location per JavaScript.  Da der Browser angewiesen wird die Datei herunter zu laden, bleibt er auf der gleichen Seite und startet den Download.

2 „Gefällt mir“

Danke für die Antwort. Ich bin eher neu in diesem Gebiet und mein Problem ist mit Ihrer Idee lösbar, aber trotzdem frage ich mich warum man es mit meinem Ansatz nicht machen kann, oder wie. So weit ich das verstehe führt ein Link zu einem GET request, und da GET in manchen Situationen begrenzt sein kann gegenüber POST sollte man vorbereitet sein, wenn eines Tages POST benötigt wird. 

Eine andere Umgehung wäre nach dem POST eine Datei auf dem Server zu speichern, und diese dann mit GET runter zu laden. Ich vermute dass man Datenspeicherung nur zum Auslesen gleich danach zu vermeiden ist, wenn möglich.

Viele Grüße

Du kannst auch ein POST per Formular machen. Das funktioniert auch. Nur wenn du es als xHR/Ajax Request machst, funktioniert es eben nicht. Warum weiß ich leider auch nicht. Aber der Browser handelt Ajax Requests eben anders.

Hier sind zwei Workarounds:

Formular per JS: JavaScript post request like a form submit - Stack Overflow

Hidden iFrame (wäre aber auch nur GET): jquery - How to specify content-type and content-disposition with $.ajax() GET response - Stack Overflow

Und hier ist nochmal beschrieben, dass die Header nur bei einem „normalen“ HTTP Request ausgewertet werden. Ein AJAX Request ist in dem Sinne wohl nicht normal: Content-Disposition - HTTP | MDN

Das findet man übrigens alles wenn man nur mal 2 Minuten googelt :wink: