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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] [ZF 1.10] Forcer le téléchargement

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

par splithead » 13 févr. 2015, 18:34

merci je cherchais cette fonction :)

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

par BaLiSTiK » 04 avr. 2014, 10:02

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

par BaLiSTiK » 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');
		}
	}

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

par BaLiSTiK » 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');
        }
    }

[ZF 1.10] Forcer le téléchargement

par BaLiSTiK » 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...