Forcer le téléchargement d’un fichier au clic, plutôt que son ouverture automatique dans le navigateur.
Exemple 1 :
référence : fr.openclassrooms.com/informatique/cours/…
Dans cet exemple, le fichier demandé est indiqué par un formulaire (transmission de la requête par méthode « post »).
Contenu du fichier de téléchargement que l’on nommera « telecharger.php » :
<?php
$erreur = "Votre requête n'a pu aboutir ; veuillez vérifier vos informations.";
if ($_POST) {
if ($_POST['codeSecret']=="toto") {
$chemin = realpath('toto.pdf');
}
else goto message;
// Les données reçues sont un fichier à télécharger :
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
// Trouve le nom du fichier à télécharger afin de nommer le fichier téléchargé :
header('Content-Disposition: attachment; filename=' . basename($chemin));
// Transfert en mode binaire - les données ne seront tansférées telles quelles (non interprétées) :
header('Content-Transfer-Encoding: binary');
// 3 lignes suivantes : pas de mise en cache
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// Trouve la taille du fichier : permet au navigateur de calculer le taux de chargement :
header('Content-Length: ' . filesize($chemin));
// Lit enfin le fichier :
readfile($chemin);
// On quitte afin d'éviter tout ajout de donnée risquant de corrompre le fichier :
exit;
}
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>What Wonderful Wine</title>
</head>
<body>
<p><?php message: echo $erreur; ?></p>
</body>
</html>
Exemple de formulaire appelant le téléchargement de toto.pdf via le fichier « telecharger.php » :
<form action="telecharger.php" method="post">
<input type="hidden" name="codeSecret" value="toto" />
<button type="submit">Envoi Toto</button>
</form>
Exemple 2 : Par « QUERY_STRING »
Le lien d’appel du fichier (depuis n’importe quelle page du site autre que la page « appel.php ») doit être du type () :
<a href="appel.php?file=exemple.mp3">exemple.mp3</a>
En tête de la page « appel.php », avant le Doctype :
<?php
$file=$_GET['file'];
$taille=filesize("fichiers/$file");
header("Content-Type: application/force-download; name=\"$file\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $taille");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("fichiers/$file");
exit();
?>
Remarques :
– le chemin au fichier est ici précisé dans le script PHP (« exemple.mp3 » est dans le sous-dossier « fichiers »)