2009-08-25 15 views
29

Ich habe eine Frage, wie kann ich etwas tun, wie folgt aus:Zend Framework, wie Header setzen

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

mit dem Zend Framework, die ich versucht habe:

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

Aber funktioniert nicht richtig .

Mit besten Grüßen,

+0

Vielleicht Header bereits gesendet? – Pawka

+0

Der korrekte Mime-Type für PDF ist application/pdf. –

Antwort

53

Ihre Anweisung, um die Antwort-Header zu setzen, ist leicht fehlerhaft:

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

Die oben arbeiten sollte - bitte beachten Sie den Unterschied in der Content-Disposition - Header.

Übrigens ... Wenn Sie eine Download-Box erzwingen möchten (anstatt das Dokument in den Browser zu laden), sollten Sie die Content-Dispositionattachment verwenden.

$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 Content-Length gesetzt haben oder die Content-type auf eine Kombination (mehrere Header) ändern von einem oder mehreren der application/force-download, application/octet-stream und/oder application/download. Und wie ich im Kommentar geschrieben habe, können Caching-Header manchmal den Download beeinträchtigen. Überprüfen Sie, welche Caching-Header gesendet werden.

+0

Ihr Beispiel funktioniert nicht SR, ich erhalte die Download-Box nicht mehr. Hier ist mein Code: http://pastebin.com/d6be142ab – Uffo

+0

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

+4

@Uffo: Wenn Sie einen Download erzwingen wollen, sollten Sie dies in Ihrer Frage sagen. Sie haben nur gefragt, wie man die Header richtig einstellt, und S. Gehrigs ursprüngliche Antwort war genau das. – Rytmis

-5

Gelöst

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

Schauen Sie sich die Antwort von S. Gehrig an, es ist die richtige. Ihre können arbeiten, aber nur nebenbei. ": inline" ist kein Teil des Kopfnamens. – Rytmis

6

Spät zur Tabelle kann ich this action helper als eine einfache, wiederverwendbare Komponente zum Senden von Dateien oder in Speicherdaten an den Browser empfehlen.

hat Optionen für das Caching, Disposition und kann Apache nutzen Sendfile

+0

nice find danke – Mark

+3

Link ist tot; irgendwelche Alternativen? –

+1

@Aron siehe http://github.com/noginn/noginn/blob/master/Noginn/Controller/Action/Helper/SendFile.php –

2

Meine Vermutung ist, dass Sie tun so etwas wie:

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

oder so etwas.

Die Antwort hier wird nie gerendert (was die Header rendert). Die Antwort wird normalerweise nach dem Drucken ausgegeben.

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

0

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

Flagging den Content-Type mit TRUE hat den Download möglich in IOS und anderen Geräten, die nur kryptische Symbole nach dem Download oder einem Fehler zeigten:

->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