Astuce : Forcer le téléchargement d’un fichier

Dans cet article je fais vous parler d’un problème auquel vous avez sûrement fait face si vous avez déjà fait un site qui propose le téléchargement de fichiers.

Problème

En effet, vous l’avez deviné, le problème se pose lorsque vous souhaitez proposer le téléchargement de fichier web (par exemple : html ou php). Vous ne pouvez pas simplement proposer un lien vers le fichier.

Le problème peut, en réalité, avoir deux causes:

  1. Compilation du fichier (compile le fichier puis l’exécute, et n’affiche donc pas son code source)
  2. Affichage du fichier (affiche une page HTML au lieu de la télécharger)

Solution à la compilation

Si vous faite un lien comme indiqué ci-dessous, le PHP va se compiler et s’exécuter :

<a href="winner.class.php">Télécharger ma classe de Winner</a>

La solution pour proposer à vos visiteurs de télécharger ce fichier est de passer par un autre script PHP qui va lire le code source de « winner.class.php » puis l’afficher au lieu de l’exécuter :

<a href="download.php?file=winner.class.php">Télécharger ma classe de Winner</a>
// download.php
readfile(basename($_GET['file']));

Solution à l’affichage

Maintenant que le problème du code source est résolu, nous voilà face à un autre problème : Si le fichier est un fichier HTML, le navigateur va vouloir l’afficher, et non le télécharger.

Mais, encore une fois, j’ai une solution pour résoudre ce problème.

La solution se trouve dans les entêtes HTTP. Ces entêtes permettent de donner, au navigateur, des informations supplémentaires sur le fichier.

// download.php
$path = '/chemin/vers/mes/fichiers/';
$file_name = $_GET['file'];
 
header('Content-disposition: attachment; filename='.$file_name);
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding:'. $mime_type);
header('Content-Length: '.filesize($path. $file_name));
header('Pragma: no-cache');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0, public');
header('Expires: 0');
 
readfile($path. basename($file_name));

Basename

Ajoutez un peu de sécurité grâce à la fonction basename.

Tagués avec : , , , , , , , , , , , ,
Publié dans Astuce

Laisser un commentaire

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

*