web-dev-qa-db-fra.com

Zend Framework comment définir les en-têtes

J'ai une question, comment puis-je faire quelque chose comme ça:

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.

Meilleures salutations,

31
Uffo

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

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

Ce qui précède devrait fonctionner - veuillez noter la différence dans le Content-Disposition-entête.

Au fait ... Lorsque vous souhaitez 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 deviez également définir le Content-Length ou modifiez le Content-type à une combinaison (plusieurs en-têtes) d'un ou plusieurs application/force-download, application/octet-stream et/ou application/download. Et comme je l'ai écrit dans le commentaire, la mise en cache des en-têtes peut parfois interférer avec votre téléchargement. Vérifiez quels en-têtes de mise en cache sont envoyés.

55
Stefan Gehrig

Tard dans le tableau, je peux recommander cet assistant d'action comme un composant simple et réutilisable pour envoyer des fichiers ou des données en mémoire au navigateur.

Possède des options pour la mise en cache, la disposition et peut utiliser Apache Sendfile

6
David Snabel-Caunt

Je suppose 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 rendue 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.

2
Justin

J'avais un ensemble d'en-tête. Ce n'était pas réglé, mais AJOUTÉ. J'avais donc un Content-Type de texte/html et aussi application/pdf.

Marquer le Content-Type avec TRUE a rendu le téléchargement possible dans IOS et d'autres appareils qui ne montraient 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

0
Guntram