Forcer le téléchargement d'un fichier - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Forcer le téléchargement d'un fichier

ElePHPant El-Roubio

Cette portion de script présente un moyen simple et efficace de forcer le téléchargement d'un fichier. Comment ça forcer un téléchargement ? Prenons l'exemple concret d'un fichier PDF car c'est celui qui semble le plus approprié pour ce genre de code.

L'utilisation d'un document PDF peut varier d'un utilisateur à un autre. En effet, certains pourront l'ouvrir directement dans leur navigateur via un plugin intégré tandis que d'autres seront obligés de le télécharger puis de l'ouvrir avec Adobe Acrobat Reader par exemple. Afin d'uniformiser ces différents comportements, nous pouvons choisir de forcer le téléchargement du document.

Portion de code

Forcer le téléchargement d'un fichier présent sur le serveur
<?php
 
/*******************************************************
  * Déclaration de la fonction
  *******************************************************/
 
/**
  * La fonction force le téléchargement d'un fichier
  *
  * @author : Hugo HAMON
  * @param : string $situtation emplacement sur le serveur web
  * @return : void
  **/
function forcerTelechargement($situation)
{
header('Content-Type: application/octet-stream');
header('Content-Length: '. filesize($situation));
header('Content-disposition: attachment; filename='. basename($situation));
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
readfile($situation);
exit();
}
 
/*******************************************************
  * Appel de la fonction
  *******************************************************/
forcerTelechargement('./documents/compte.pdf');
 
?>

Les commentaires

1. Par Sowhat le samedi 27 octobre 2007 à 13:01

Je trouve que c'est mieux de se passer du troisième argument en faisant :
header('Content-Length: '. filesize($nom));
Non ?

2. Par Sowhat le samedi 27 octobre 2007 à 13:01

header('Content-Length: '. filesize($emplacement));
Plutôt Emoticone moqueur

3. Par Emacs le samedi 27 octobre 2007 à 17:05

Oui tu as raison, je n'y avais pas pensé sur le coup.

J'ai mis à jour la fonction en l'optimisant encore un peu. Désormais, elle ne prend plus qu'un seul paramètre : le chemin vers le fichier à télécharger.

++

Hugo.

Ajouter un commentaire

Votre avis
Se souvenir de mes informations