--> Forcer le téléchargement d'un fichier en PHP - Des Trucs à Web

Forcer le téléchargement d’un fichier en PHP

Voici comment forcer le téléchargement d’un fichier en PHP.
Pour que le script fonctionne, il ne faut pas d’instruction qui affiche quelque chose à l’écran avant les lignes header.

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éer un fichier » telecharger.php » avec comme contenu :<?php

// Nous essayons de reconnaitre l'extension pour que le téléchargement corresponde au type de
// fichier. Cela permet d'éviter 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 faire un fichier test.php ou test.html suivant ses préférences.
On appelle le fichier telecharger.php en passant en paramètre le nom du fichier à télécharger ainsi que le chemin. Exemple : 

<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>

Ou simplement si l'on ne veut utiliser que du HTML.

<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>