Zend Framework wie man Header setzt

Lesezeit: 3 Minuten

Benutzer-Avatar
Uffo

Ich habe eine Frage, wie kann ich so etwas tun:

header("Content-Disposition: inline; filename=result.pdf"); 
header("Content-type: application/x-pdf"); 

Mit Zend Framework habe ich versucht:

        $this->getResponse()
        ->setHeader('Content-Disposition:inline', ' filename=result.pdf')
        ->setHeader('Content-type', 'application/x-pdf');

Funktioniert aber nicht richtig.

  • Der richtige Mime-Type für PDF ist application/pdf.

    Benutzer520634

    25. November 2010 um 20:56 Uhr

Benutzer-Avatar
Stefan Gehrig

Ihre Anweisung zum Festlegen der Antwortheader ist leicht fehlerhaft:

$this->getResponse()
     ->setHeader('Content-Disposition', 'inline; filename=result.pdf')
     ->setHeader('Content-type', 'application/x-pdf');

Das obige sollte funktionieren – bitte beachten Sie den Unterschied in der Content-Disposition-Header.

Übrigens… Wenn Sie eine Download-Box erzwingen wollen (anstatt das Dokument im Browser zu laden), sollten Sie die verwenden Content-Disposition attachment.

$this->getResponse()
     ->setHeader('Content-Disposition', 'attachment; filename=result.pdf')
     ->setHeader('Content-type', 'application/x-pdf');

Je nach Browser kann es möglich sein, dass Sie auch die einstellen müssen Content-Length oder ändern Sie die Content-type zu einer Kombination (mehrere Header) von einem oder mehreren von application/force-download, application/octet-stream und/oder application/download. Und wie ich im Kommentar geschrieben habe, kann es vorkommen, dass Caching-Header Ihren Download stören. Überprüfen Sie, welche Caching-Header gesendet werden.

  • Ihr Beispiel funktioniert nicht SR, ich erhalte die Downloadbox nicht mehr. Hier ist mein Code: pastebin.com/d6be142ab

    – Ufo

    25. August 2009 um 6:26 Uhr

  • Welcher Browser? Und können Sie überprüfen, welche Header tatsächlich über die Leitung gesendet werden? Insbesondere einige Caching-Header können das Herunterladen von Dateien stören.

    – Stefan Gehrig

    25. August 2009 um 7:08 Uhr

  • @Uffo: Wenn Sie einen Download erzwingen möchten, sollten Sie dies in Ihrer Frage angeben. Sie haben nur gefragt, wie die Header richtig gesetzt werden, und die ursprüngliche Antwort von S. Gehrig war genau diese.

    – Rytmis

    25. August 2009 um 9:09 Uhr

Benutzer-Avatar
David Snabel-Caunt

Spät an den Tisch, kann ich empfehlen dieser Aktionshelfer als einfache, wiederverwendbare Komponente zum Senden von Dateien oder im Speicher befindlichen Daten an den Browser.

Hat Optionen für Caching, Disposition und kann Apache Sendfile verwenden

  • Link ist tot; irgendwelche Alternativen?

    – Aron Rotteveel

    21. April 2010 um 11:34 Uhr

  • @Aron siehe github.com/noginn/noginn/blob/master/Noginn/Controller/Action/…

    – David Snabel-Caunt

    21. April 2010 um 12:00 Uhr

  • Schön, aber das sollte nicht die ganze Datei auf einmal lesen, sondern Teil für Teil. Für große Dateien ist es ein Overkill.

    – nimmthin

    25. April 2010 um 10:25 Uhr

  • Es kann Apache Sendfile verwenden, das viel effizienter ist, falls verfügbar

    – David Snabel-Caunt

    25. April 2010 um 12:38 Uhr

Meine Vermutung ist, dass Sie so etwas tun:

$this->getResponse()
        ->setHeader('Content-Disposition:inline', ' filename=result.pdf')
        ->setHeader('Content-type', 'application/x-pdf');
fpassthru($filename);
exit();

oder so.

Die Antwort hier wird niemals gerendert (wodurch die Header gerendert werden). Die Antwort wird normalerweise während des Druckens nach der Aktion gerendert.

Sie müssen die Header direkt setzen (wie Sie im Nicht-oo-Code notiert haben) oder verwenden $this->getResponse()->sendHeaders() direkt.

Ich hatte ein Header-Set. Es wurde nicht gesetzt, sondern HINZUGEFÜGT. Also hatte ich einen Content-Type von text/html und auch application/pdf.

Das Flag des Content-Type mit TRUE ermöglichte den Download in IOS und anderen Geräten, die nach dem Download nur kryptische Symbole oder einen Fehler anzeigten:

->setHeader('Content-type', 'application/x-pdf', true);

setHeader($name, $value, $replace = false)

aus:
https://framework.zend.com/manual/1.12/de/zend.controller.response.html

Gelöst

        $this->getResponse()
         ->setHeader('Content-Disposition:inline', ';filename=result.pdf')
             ->setHeader('Content-Type', 'application/x-pdf');

  • Schauen Sie sich die Antwort von S. Gehrig an, es ist die richtige. Ihre kann funktionieren, aber nur nebenbei. “:inline” ist kein Teil des Namens des Headers.

    – Rytmis

    25. August 2009 um 6:14 Uhr

  • Schauen Sie sich die Antwort von S. Gehrig an, es ist die richtige. Ihre kann funktionieren, aber nur nebenbei. “:inline” ist kein Teil des Namens des Headers.

    – Rytmis

    25. August 2009 um 6:14 Uhr

1175840cookie-checkZend Framework wie man Header setzt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy