2009-08-25 7 views
29

J'ai une question, comment puis-je faire quelque chose comme ceci:Zend Framework comment définir les en-têtes

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

Avec Zend Framework, j'ai essayé:

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

Mais ne fonctionne pas correctement .

Cordialement,

+0

Peut-être que les en-têtes sont déjà envoyés? – Pawka

+0

Le type Mime correct pour PDF est application/pdf. –

Répondre

53

Votre instruction pour définir les en-têtes de réponse est légèrement malformée:

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

Le ci-dessus devraient travailler - s'il vous plaît noter la différence dans le Content-Disposition - entête. Par ailleurs ... Si vous voulez forcer une boîte de téléchargement (au lieu de charger le document dans le navigateur), vous devez utiliser le Content-Dispositionattachment.

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

Selon le navigateur, il est possible que vous devez également définir le Content-Length ou modifier le Content-type à une combinaison (plusieurs en-têtes) d'un ou plusieurs des application/force-download, application/octet-stream et/ou application/download. Et comme je l'ai écrit dans le commentaire parfois les en-têtes de mise en cache peuvent interférer avec votre téléchargement. Vérifiez pour voir quels en-têtes de cache sont envoyés.

+0

Vous êtes exemple ne fonctionne pas SR, je ne reçois plus la boîte de téléchargement.Voici mon code: http://pastebin.com/d6be142ab – Uffo

+0

Quel navigateur? Et pouvez-vous vérifier quels en-têtes sont effectivement envoyés sur le fil? En particulier, certains en-têtes de mise en cache peuvent interférer avec les téléchargements de fichiers. –

+4

@Uffo: Si vous voulez forcer un téléchargement, vous devriez le dire dans votre question. Vous avez seulement demandé quelle est la bonne façon de définir les en-têtes, et la réponse originale de S. Gehrig était juste cela. – Rytmis

-5

SOLVED

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

Regardez la réponse de S. Gehrig, c'est la bonne. Le vôtre peut fonctionner, mais seulement de manière incidente. ": inline" ne fait pas partie du nom de l'en-tête. – Rytmis

6

En fin de table, je peux recommander this action helper comme un composant simple et réutilisable pour envoyer des fichiers ou des données de mémoire au navigateur.

a des options pour la mise en cache, la disposition et peut utiliser Apache Sendfile

+0

belle trouvaille merci – Mark

+3

Lien est mort; des alternatives? –

+1

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

2

Je pense que vous faites quelque chose comme:

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

ou quelque chose.

La réponse ici ne sera jamais rendue (ce qui rend les en-têtes). La réponse est généralement affichée lors de l'impression post-action.

Vous devrez directement définir les en-têtes (comme vous l'avez noté dans le code non-oo), ou utiliser $this->getResponse()->sendHeaders() directement.

0

J'avais un jeu d'en-tête. Il n'a pas été défini, mais ajouté. J'avais donc un Content-Type de texte/html et aussi application/pdf.

Signalement Content-Type TRUE fait le téléchargement possible dans l'IOS et d'autres dispositifs qui ne montrait que des symboles cryptiques après le téléchargement ou une erreur:

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

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

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