Forcer le téléchargement

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&ecirc;te n'a pu aboutir ; veuillez v&eacute;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 »)

Laisser un commentaire

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