Forcer le téléchargement d'un fichier avec PHP

Dance cet article nous allons voir comment forcer le navigateur à télécharger un fichier (n’importe lequel) au lieux de l’ouvrir. Pour cela nous allons utiliser les Headers qu’envoie le serveur au navigateur (fonction header de php).

Voici le code a utiliser :

 //date actuelle
$date = gmdate('D, d M Y H:i:s');
 
header("Content-Type: text/xml"); //Ici par exemple c'est pour un fichier XML, a changer en fonction du type mime du fichier voulu.
header('Content-Disposition: attachment; filename=NOM_FICHIER.xml');
header('Last-Modified: '. $date . ' GMT');
header('Expires: ' . $date);
//header specifique IE :s parce que sinon il aime pas
if(preg_match('/msie|(microsoft internet explorer)/i', $_SERVER['HTTP_USER_AGENT'])){
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
}else{
  header('Pragma: no-cache');
}
 
echo $CONTENU_DE_NOTRE_FICHIER; // ou readfile('CHEMIN_FICHIER'); En fonction du type de fichier.

Le type Mime doit être celui du fichier qu’on veut pouvoir télécharger (liste des types mime disponibles). En voici quelques exemples :

image GIF : image/gif
fichier XML : text/xml
fichier rtf : application/rtf
fichier avi : video/msvideo

Maintenant à vos fichiers dl.php 😉

Share

PHP 5, un constructeur et un destructeur uniformisés

Avec PHP 5, les choses deviennent plus simples et plus logiques: toute méthode réservée par PHP 5 est préfixée par __ (double soulignement ou underscore). C’est le cas notamment du constructeur déclaré par la méthode __construct et du destructeur déclaré par __destruct. Il faut noter malheureusement, qu’il n’est toujours pas possible de déclarer plusieurs constructeurs avec des paramètres différents alors qu’il est maintenant possible de typer les paramètres de méthode.

Voici un exemple d’utilisation de constructeur et de destructeur:

// La ligne ci-dessous permet d'afficher tout texte comme texte simple et non comme
// du HTML. C'est utile si nous utiliserons la fonction print_r/print('n')
// (voir la documentation PHP pour plus d'info)
 
header("Content-type: text/plain");
 
class Utilisateur {
   private $nom = null;
   private $prenom = null;
   private $dateNaissance = null;
 
   function Utilisateur($nom, $prenom, $dateNaissance=null) {
       print("Utilisateur($nom, $prenom, $dateNaissance=null) appelé");
   }
 
   function __construct($nom, $prenom, $dateNaissance=null) {
       print("__construct($nom, $prenom, $dateNaissance=null) appelé");
       $this->nom = $nom;
       $this->prenom = $prenom;
       $this->dateNaissance = $dateNaissance;
   }
 
   function __destruct() {
       print("__destruct() appelé");
       unset($this->nom);
       unset($this->prenom);
       unset($this->dateNaissance);
   }
}
 
$utilisateur = new Utilisateur("MARTIN", "Pierre");
unset($utilisateur);

Vous remarquerez à l’exécution que l’ancien constructeur PHP 4 n’est plus utilisé. C’est totalement normal dès que vous utilisez un constructeur de type PHP 5. Ceci permet une compatibilité ascendante de PHP et ainsi de pouvoir continuer d’utiliser des classes développées pour PHP 4 avec la dernière version du langage.

L’appel du destructeur est fait implicitement par le moteur de PHP à la fin du script. Mais si vous souhaitez faire de la programmation propre, vous devez l’appeler explicitement avec le mot clé unset qui existe déjà avec PHP 4. C’est ce que nous faisons avec le unset($utilisateur) à la fin du code. Nous le faisons aussi dans le destructeur de la classe Utilisateur.

Si nous avions utilisé des objets pour stocker les attributs de cette classe (des objets String par exemple), leurs destructeurs respectifs auraient, eux aussi, été appelés produisant un effet « domino » sur l’ensemble des objets utilisés.

Pour les connaisseurs, l’équivalent du mot clé unset en langage C++ est delete (un temps envisagé semble-t-il avec PHP 5).

Source : http://www.toutprogrammer.com

Share