[RESOLU] [ZF 1.10] Forcer le téléchargement

Eléphant du PHP | 398 Messages

12 août 2013, 13:51

Bonjour,

Un peu noob sur Zend Framework, je suis confronté à un petit soucis de rien du tout mais qui me rend chèvre :D.
Je dois simplement forcer le téléchargement d'un PDF, voilà mon code jusqu'à présent :
    /**
     * Force le téléchargement du guide utilisateur
     */
    public function documentAction ()
    {
        $this->disableRendering(true, false);
        $dirname = APP_ROOT . DS . 'data' . DS . 'documents' . DS;
        $filename = $dirname . __('docUser.ent');
        //echo $filename;
        if (file_exists($filename)) {
            $this->getResponse()
                ->setHeader('Content-Disposition', 'attachment; filename="' . basename($filename) . '"')
                ->setHeader('Content-type', 'application/x-pdf')
                ->setHeader('Cache-control', 'public')
                ->setHeader('Content-Transfer-Encoding', 'binary')
                ->setHeader('Content-length', filesize($filename));
            readfile($filename);
        } else {
            $this->addMessage("Erreur de téléchargement du guide utilisateur");
            //$this->redirector('action', 'controller');
        }
    }
Le téléchargement se fait bien, le fichier à la bonne taille...mais erreur de lecture (alors que le fichier d'origine est ok). Est-ce un oublie dans mon code ou autre chose toute bête que j’aurai oublié de mettre ou encore mal codé ?

Merci d'avance.

EDIT : J'ai testé avec plusieurs fichiers PDF ça me fait pareil, Firefox ou IE pareil, et j'ai tenté en utilisant directement header() :
    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
    header('Content-length: ' . filesize($filename));
Et surprise...pareil...là je n'ai plus d'idées...
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 398 Messages

12 août 2013, 16:38

Résolu...c'était un soucis de rendering avec ma méthode $this->disableRendering() qui désactive la vue et le layout, il suffisait juste de mettre les deux paramètres à false.
Du coup voici le code :
    /**
     * Force le téléchargement du guide utilisateur
     */
    public function documentAction ()
    {
        $dirname = APP_ROOT . DS . 'data' . DS . 'documents' . DS;
        $filename = $dirname . __('docUser.ent');
        //echo $filename;
        if (file_exists($filename)) {
            $this->getResponse()
                ->setHeader('Content-type', 'application/pdf', true)
                ->setHeader('Content-Disposition', 'inline; filename="' . basename($filename) . '"', true)
                ->setHeader('Content-Transfer-Encoding', 'binary', true)
                ->setHeader('Cache-control', 'must-revalidate, post-check=0, pre-check=0', true)
                ->setHeader('Pragma', 'public', true)
                ->setHeader('Content-length', filesize($filename), true);
            
            readfile($filename);
            $this->disableRendering(true, true);
        } else {
            $this->addMessage("Erreur de téléchargement du guide utilisateur");
            $this->redirector('search', 'company');
        }
    }
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 398 Messages

02 avr. 2014, 15:41

Je reup ce topic, car j'ai réutilisé mon code pour mon projet perso, mais bizarrement, après quelques modifs (légères), je fichier que je veux faire télécharger, s'ouvre directement dans l'onglet, alors que je veux forcer le téléchargement.
Le code, côté vue :
<a href="<?php echo $this->baseUrl(); ?>/Index/document/type/pdf" class="btn btn-default" title="Télécharger le CV au format PDF"><i class="fa fa-download"></i> PDF</a>


Et côté PHP (indexController)
	public function documentAction ()
	{
		$dirDocument = dirname(APPLICATION_PATH) . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR . 'documents' . DIRECTORY_SEPARATOR;
		$typeFile = $this->_getParam("type"); //recuperation du type de doc, par defaut PDF
		
		if (isset($typeFile)) {
			$file = Zend_Registry::getInstance()->constants->files->cv->$typeFile;
			$fileName = $dirDocument . $file;
			
			if (file_exists($fileName)) {
				$this->getResponse()
	                ->setHeader('Content-type', 'application/pdf', true)
	                ->setHeader('Content-Disposition', 'inline; filename="' . basename($fileName) . '"', true)
	                ->setHeader('Content-Transfer-Encoding', 'binary', true)
	                ->setHeader('Content-Description', 'File Transfer', true)
	                ->setHeader('Cache-control', 'must-revalidate, post-check=0, pre-check=0', true)
	                ->setHeader('Pragma', 'public', true)
	                ->setHeader('Content-length', filesize($fileName), true);
	            
	            readfile($fileName);
	            $this->_helper->layout()->disableLayout(); 
		    	$this->_helper->viewRenderer->setNoRender(true);
			} else {
				$this->_forward('index', 'competences');
			}
			
		} else {
			$this->_forward('index', 'competences');
		}
	}
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 398 Messages

04 avr. 2014, 10:02

Réponse trouvée, la solution était :
->setHeader('Content-Disposition', 'attachment; filename="' . basename($fileName) . '"', true)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Petit nouveau ! | 9 Messages

13 févr. 2015, 18:34

merci je cherchais cette fonction :)