Déc
6

Zend Framework : Aide d’action pour télécharger un fichier


Aujourd’hui nous allons voir comment réaliser une aide d’action (helper) en Zend Framework qui vous permettra le téléchargement direct d’un fichier (par défaut, un lien vers un fichier ouvrira le fichier dans le navigateur).

Pour cela nous allons créer un fichier Download.php dans votre dossier controllers/helpers

<?php
class Controller_Helper_Download extends Zend_Controller_Action_Helper_Abstract 
{
	/**
	 * 
	 * Enter description here ...
	 */
	public function direct($dossier,$filename)
	{
		return $this->download($dossier,$filename);
	}
 
	  public function download($dossier,$filename)
    {
        $filepath = $dossier.DS.$filename;
    	$filesize = filesize($filepath);
        $filemd5 = md5_file($filepath);
 
        // Gestion du cache
        header('Pragma: public');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
        header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
        // Informations sur le contenu à envoyer
       // header('Content-Tranfer-Encoding: ' . $type . "\n");
        header('Content-Length: ' . $filesize);
        header('Content-MD5: ' . base64_encode($filemd5));
        header('Content-Type: application/force-download; name="' . $filename . '"');
        header('Content-Disposition: attachement; filename="' . $filename . '"');
        // Informations sur la réponse HTTP elle-même
        header('Date: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
        header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 1) . ' GMT');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
        readfile($filepath);
        exit;
    }
 
}


Pour ma part, les informations de mes fichiers sont stockées en base de données, donc je passe à mon controller l’identifiant du fichier à récupérer

Je vais donc avoir un controller comme ceci

<?php
 
 
class Default_DownloadController extends Zend_Controller_Action
{
    public function indexAction()
    {
       $id = intval($this->_getParam('id'));
    	//On récupère les informations du fichier que l'on souhaite télécharger 
        //Pour ma part, j'utilise Doctrine
    	$fichier = Model_FilesTable::getFile($id);
    	//Récupération de votre chemin complet
 	$destPath = APPLICATION_PATH.DS.'..'.DS.'public'.DS.'media';
 	//On sépare le nom du fichier et le chemin car on a en besoin séparément dans le helper	
 	$this->_helper->download($destPath,$fichier['file_url']);
    	//On désactive le rendu de la vue
    	$this->_helper->viewRenderer->setNoRender();
    }
 
}

Ensuite, dans ma vue, je vais construire l’url à partir de la route suivante

[routes]
routes.telechargement-fichier.route               = download/:id
routes.telechargement-fichier.defaults.module     = default
routes.telechargement-fichier.defaults.controller = download
routes.telechargement-fichier.defaults.action     = index

ce qui donnera dans ma vue

<a href="<?php echo $this->url(array('id'=>$this->file_id),'telechargement-fichier'); ?>" title="Télécharger ce fichier"><?php echo $this->file_url;?> </a>




1 Comment to “Zend Framework : Aide d’action pour télécharger un fichier”

  • Ben 3 février 2013 à 15 h 36 min

    Bonjour,

    Merci pour les explications bien détaillées.
    Chez moi le script ne force pas la téléchargement sous IE, cela fonctionne uniquement pour les autres navigateurs (Chrome, Firefox et Safari)

    De plus je n’ai pas réussi à en faire un Helper, j’ai placé le code directement dans mon controller du coup… Probablement un problème de configuration de mon environnement Zend.
    Doit-on ajouter autre chose pour que le helper soit reconnu ? Zend m’indique qu’il ne connait pas le helper Download.

    Merci par avance.

Poster un commentaire

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Étiquettes