Voici comment forcer téléchargement d’un fichier à l’aide du PHP.
Pour que le script fonctionne il ne faut pas d’instruction qui affiche quelques choses à l’écran avant les lignes header (balises <head></head>).
Sinon vous obtiendrez un message du style :
» Warning : Cannot modify header information – headers already sent by (output started at d:\creation\easyphp\www\_test\test.php:2) in d:\creation\easyphp\www\_test\test.php on line 3″
Par exemple, créons un fichier nommé » telecharger.php » avec comme contenu :
<?php // Nous essayons de reconnaître l'extension afin que le téléchargement // corresponde au type de fichier. Cela évite les erreurs de corruptions. switch(strrchr(basename($Fichier_a_telecharger), ".")) { case ".gz": $type = "application/x-gzip"; break; case ".tgz": $type = "application/x-gzip"; break; case ".zip": $type = "application/zip"; break; case ".pdf": $type = "application/pdf"; break; case ".png": $type = "image/png"; break; case ".gif": $type = "image/gif"; break; case ".jpg": $type = "image/jpeg"; break; case ".txt": $type = "text/plain"; break; case ".htm": $type = "text/html"; break; case ".html": $type = "text/html"; break; default: $type = "application/octet-stream"; break; } header("Content-disposition: attachment; filename=$Fichier_a_telecharger"); header("Content-Type: application/force-download"); header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger)); header("Pragma: no-cache"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); header("Expires: 0"); readfile($chemin . $Fichier_a_telecharger); ?>
Ensuite, créons un fichier permettant de réaliser un test que nous appellerons au hasard 🙂 « test.php » ou « test.html » suivant ses préférences.
Dans le code ci-dessous, nous appelons le fichier « telecharger.php » en passant en paramètre le nom du fichier à télécharger ainsi que son chemin.
Il n’y a plus qu’à exécuter le fichier « test (php ou html) » afin de voir le résultat.
<html> <head> <title>Forcer le téléchargement d'un fichier</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php // Test du téléchargement d'un fichier avec reconnaissance du type de fichier echo "<a href=\"telecharger.php?Fichier_a_telecharger=monfichier.txt&chemin=test/\">Télécharger</a>"; ?> </body> </html> <span class="stitrecode">Ou simplement si l'on ne veut utiliser que du html </span> <html> <head> <title>Test du téléchargement d'un fichier</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <a href="telecharger.php?Fichier_a_telecharger=monfichier.txt&chemin=test/">Télécharger</a> </body> </html>