Page 1 sur 1

[ZF 1.10] Forcer le téléchargement

Posté : 12 août 2013, 13:51
par BaLiSTiK
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...

Re: [ZF 1.10] Forcer le téléchargement

Posté : 12 août 2013, 16:38
par BaLiSTiK
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');
        }
    }

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

Posté : 02 avr. 2014, 15:41
par BaLiSTiK
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');
		}
	}

Re: [ZF 1.10] Forcer le téléchargement

Posté : 04 avr. 2014, 10:02
par BaLiSTiK
Réponse trouvée, la solution était :
->setHeader('Content-Disposition', 'attachment; filename="' . basename($fileName) . '"', true)

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

Posté : 13 févr. 2015, 18:34
par splithead
merci je cherchais cette fonction :)