Petite classe PHP pour forcer le Téléchargement

Voici une petite classe PHP bien pratique et issue de Ludik FrameWork.

Elle est simple et sans prétention, mais je croise souvent des internautes qui souhaitent ce genre d’outils sur le web. Alors, en attendant que le Ludik FrameWork soit disponible en téléchargement, je vous met à disposition cette classe.

Cette classe qui se nomme downloadFile va vous permettre de forcer le téléchargement d’éléments que vous souhaitez faire Downloader. En effet, il arrive parfois que vous souhaitiez proposer un pdf en téléchargement et ce dernier s’affiche directement dans le navigateur. Voici une classe qui vous sera utile :

<?php
/**
 * @package     Ludik_FrameWork_0.5 - Nacimiento
 * @author      Franck Pertegas
 * @copyright   LudiKreation
 * @link        http://www.ludikreation.com
 * @license     http://www.gnu.org/licenses/lgpl.html GNU General Lesser  Public Licence, see LICENCE file
 * @divers      Issu du développement pour des sites :: ludikreation de Franck Pertegas
 * @version     1.0.0
 * @Date        01/05/2009
 */


/**
 * downloadFile
 * Classe de gestion de téléchargement - PHP 5 oblige - A utiliser dans une page vierge de toute sortie !
 * @package Ludik_FrameWork
 */


class downloadFile{
   
    /**
     * nom du fichier a télécharger
     * @var string
     * @access public
     */

    public $filename;
   
    /**
     * nom du fichier pour la sauvegarde de l'internaute
     * @var string
     * @access public
     */

    public $newfilename;
   
    /**
     * chemin pour arriver au fichier
     * @var string
     * @access public
     */

    public $filepath;
   
    /**
     * taille du fichier
     * @var string
     * @access private
     */

    private $filesize;
   
    /**
     * encodage nécessaire pour le fichier
     * @var string
     * @access private
     */

    private $filemd5;
   
    /**
     * Format de date de l'entete
     * @var string
     * @access public
     */

    public $dateformat;
   
   
    /**
     * Constructeur public
     * @param string $filename :: le nom du fichier avec son extension bien sur^^
     * @param string $filepath :: le chemin du fichier, par défaut ''
     * @param string $newfilename :: le nom du fichier pour l'internaute par default $filename
     */

    public function __construct($filename, $filepath = '', $newfilename = ''){
   
        $this->filename = $filename;
        $this->filepath = self::cleanPath($filepath);
        $this->dateformat = 'D, d M Y H:i:s';
        $this->filesize = filesize($this->filepath.$this->filename);
        $this->filemd5 = md5_file($this->filepath.$this->filename);
       
        if($newfilename == '')
            $this->newfilename = $this->filename;
        else
            $this->newfilename = $newfilename;
           
    }
   
    /**
     * Méthode public static (cleanPath([...])) permettant d'ajouter le slash au chemin si ce dernier n'y est pas
     * @param string $path :: le chemin entré
     */

    public static function cleanPath($path){
       
        $path = $path;
       
        if(substr($path, -1, 1) != '/'){
           
            $path .= '/';
           
        }
       
        return $path;
       
    }
   
    /**
     * Méthode public static (getExtension()) permettant d'obtenir l'extension du fichier passé en argument (Une methode de la Classe uploadFile)
     * @param string $file :: le nom du fichier avec son extension bien sur^^
     * @return string l'extension (ex : "jpg")
     */

    public static function getExtension($file){
       
        return substr($file, -3);
       
    }
   
    /**
     * Méthode public (forceDownload()) permettant de forcer un téléchargement de fichier - Renvoi plusieurs entete header !!
     * @return boolean si réussite (true) ou non (false).
     */

    public function forceDownload(){
   
        //
        // Quelques éléments nécessaires
        //
        error_reporting(0);
        ini_set('zlib.output_compression', 0);
       
       
        /*
        * Les en tetes nécessaires
        */

       
        //
        // Gestion du cache
        //
        header('Pragma: public');
        header('Last-Modified: '.gmdate($this->dateformat).' GMT');
        header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
       
        //
        // Informations sur le contenu a envoyer
        //
        header('Content-Tranfer-Encoding: none');
        header('Content-Length: '.$this->filesize);
        header('Content-MD5: '.base64_encode($this->filemd5));
        header('Content-Type: application/octetstream; name="'.$this->filename.'"');
        header('Content-Disposition: attachment; filename="'.$this->newfilename.'.'.self::getExtension($this->filename).'"');
       
        //
        // Informations sur la réponse HTTP elle-meme
        //
        header('Date: '.gmdate($this->dateformat, time()).' GMT');
        header('Expires: '.gmdate($this->dateformat, time()+1).' GMT');
        header('Last-Modified: '.gmdate($this->dateformat, time()).' GMT');
       
       
        /*
        * Envoi du fichier
        */

       
        if(readfile($this->filepath.$this->filename))
            return true;
       
    }

}

?>

Bien entendu cette classe est issue de diverses sources et recherches et permet donc de forcer le download de fichiers.

Comment l’utiliser ?

Tout d’abords n’oubliez pas que votre page qui utilisera cette classe devra être vierge de toute sortie, afin de ne pas faire planter le script.

<?php

// Instanciation de l'objet (le fichier appelé, le chemin vers ce fichier, la nouvelle appellation du fichier lors du téléchargement)
$download = new downloadFile('monfichier.pdf', 'mesfichiers/pdf', 'Mon-nouveau-nom-de-fichier');
// On force le download (return boolean)
$download->forceDownload();

?>

Voilà, tout simplement et vous pouvez ainsi forcer le téléchargement et renommer le fichier ainsi téléchargé.

Pour toutes questions, remarques, contributions, n’hésitez pas…

Comments
  1. smelllike
  2. LudiKadmin
  3. REM
  4. LudiKadmin
  5. REM
  6. LudiKadmin
  7. REM
  8. Styve

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*