Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je rencontre un problème assez étrange avec un projet zend. En effet je force le download d'un fichier PDF dans une action du controlleur et cela fonctionne très bien, en local uniquement! Mais dès que je met le code en ligne, le fichier se télécharge, l'extension est bien un PDF mais lorsqu'on l'ouvre il m'affiche un message m'indiquant que le fichier et corrompu. Je trouve vraiment ça bizarre et je me demande si ce n'est pas lié au framework. Voici le code:
function downloadAction()
{
$this->_helper->viewRenderer->setNoRender();
header('Content-Type: application/pdf');
$_file_name = $this->_request->getParam('file'); // le fichier récupéré en théorie
$f_location = $this->view->baseUrl.'http://www.guitar-gathering.com/public/files/'.$_file_name;
header('Content-Disposition: attachment; filename="monfichier.pdf"');
readfile('monfichier.pdf');
}
Existe t-il une autre manière de faire avec le Zend? Car là franchement je ne vois pas ce qui cloche.
Merci
Dernière modification par Tavarez (06-02-2009 23:38:31)
Hors ligne
Hello,
As-tu un layout ? Car dans ce cas, il faut aussi le désactiver.
A+
Hors ligne
Tavarez a écrit:
Bonjour,
Je rencontre un problème assez étrange avec un projet zend. En effet je force le download d'un fichier PDF dans une action du controlleur et cela fonctionne très bien, en local uniquement! Mais dès que je met le code en ligne, le fichier se télécharge, l'extension est bien un PDF mais lorsqu'on l'ouvre il m'affiche un message m'indiquant que le fichier et corrompu. Je trouve vraiment ça bizarre et je me demande si ce n'est pas lié au framework. Voici leCode:
function downloadAction() { $this->_helper->viewRenderer->setNoRender(); header('Content-Type: application/pdf'); $_file_name = $this->_request->getParam('file'); // le fichier récupéré en théorie $f_location = $this->view->baseUrl.'http://www.guitar-gathering.com/public/files/'.$_file_name; header('Content-Disposition: attachment; filename="monfichier.pdf"'); readfile('monfichier.pdf'); }Existe t-il une autre manière de faire avec le Zend? Car là franchement je ne vois pas ce qui cloche.
Merci
plusieurs chose sur ton code
header('Content-Type: application/pdf');
Utilise les méthodes addHeader de zend cela te permet de gérer ce que zend envoie par defaut
$_file_name = $this->_request->getParam('file'); // le fichier récupéré en théorie $f_location = $this->view->baseUrl.'http://www.guitar-gathering.com/public/files/'.$_file_name;
à quoi sert ce code vu que tu n'utilise pas les variable en question ?
header('Content-Disposition: attachment; filename="monfichier.pdf"');
même topos que plus haut
readfile('monfichier.pdf');
ce fichier existe-t-il vu que tu ne tiens pas compte de tes variables ?
A+JYT
Hors ligne
Merci pour vos réponse, en ce qui concerne le Layout je vais essayer quand j'aurai trouvé comment . Sinon je vais essayer tes méthodes, en ce qui concerne les variables c'est normal que je ne les utilise pas c'etait pour voir si ça ne provenait pas du nom récupéré mais apparement non. Je vous tiens au courant
Hors ligne
Salut,
Attention si ton serveur est sous windows la fonction readfile() peut ne pas bien fonctionner, et les fichiers téléchargés se retrouvent incomplets.
Il vaut mieux utiliser dans ce cas la fonction fpassthru.
Par contre attention, cette fonction dump directement le résultat sur la sortie et non dans un buffer comme readfile, il faut faire gaffe à ce qu'on fait dans l'action.
Exemple :
if (file_exists($f_location)) { // Continue seulement si le fichier existe $f_size = filesize($f_location); $fp = fopen($f_location,"rb"); $this->getResponse()->clearHeaders() ->setHeader('Content-Description', 'File Transfer', true) ->setHeader('Content-Disposition', 'attachment; filename='.$f_name.';', true) ->setHeader('Content-Type', 'application/pdf', true) ->setHeader('Content-Transfer-Encoding', 'binary', true) ->setHeader('Content-Length',$f_size,true) ->setHeader('Pragma','no-cache',true) ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0, public',true) ->setHeader('Expires',0, true) ->sendResponse(); // force l'envoie immédiat des headers pour bien attraper le fpassthru fpassthru($fp); fclose($fp); // exit; } else { // Si le fichier n'existe pas : mauvais paramètre fn throw new Zend_Controller_Action_Exception(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION,404); exit; }
L'exemple n'est peut-être pas tout à fait approprié, mais c'est pour avoir une idée.
Après si c'est pas ça du tout, c'est quand même bien de le savoir :p
A+ benjamin.
Dernière modification par Delprog (07-02-2009 21:14:31)
Hors ligne
Perso je suis un fervent utilisateur de file_get_contents() qui fait presque le café...
Hors ligne