Mise en place du script

Créez un fichier nommé "telecharge.php" et inscrivez ce code:

<?
	if (isset($_GET['doc']) && !empty($_GET['doc']) ) {
		/* Note:
		   il faut obligatoirement une condition pour le téléchargement ici
		   sinon on pourrait télécharger le code source de vos scripts PHP
		   on pourrait aussi faire appel à une base de données avec un champ 
		   ID (identifiant unique) passé en paramètre.
		*/
		if ( isset($_GET['dir']) ) 
			$filename = BASE_DIR . '/' . $_GET['dir'] . '/' . $filename;
		else
			$filename = BASE_DIR . '/' . $filename;

		header('Content-type: application/octet-stream');
		header('Content-Disposition: attachment; filename='.$_GET['doc']);
		if ( ($fp = fopen($filename,'rt')) ) {
			fpassthru($fp);
			fclose($fp);
		}
		else
			echo 'Impossible d\'ouvrir le fichier suivant: '.$_GET['doc'];
	}
	exit();
?>

Utilisation

  • Pour le fichier http://membres.lycos.fr/VOTRE_LOGIN/fichier.php:
    <a href="telecharge.php?doc=fichier.php">fichier.php</a>
  • Pour le fichier http://membres.lycos.fr/VOTRE_LOGIN/dossier/fichier.php:
    <a href="telecharge.php?doc=fichier.php&amp;dir=dossier">fichier.php</a>
    Attention, il ne faut mettre de barre oblique (slash) à la fin du répertoire/dossier.

Avertissement

Il faut à tout prix contrôler la nature des fichiers télécharger. Par exemple, on pourrait permettre seulement le téléchargement de fichier .zip ou encore .doc . Pour quelle raison? Si on ne limite pas ce script, quelqu'un pourrait télécharger le code source de vos fichiers PHP.

Exemple de protection simple

Téléchargement de fichiers: .jpg

<?
	if (isset($_GET['doc']) && !empty($_GET['doc']) ) {
		if ( isset($_GET['dir']) ) 
			$filename = BASE_DIR . '/' . $_GET['dir'] . '/' . $filename . '.jpg';
		else
			$filename = BASE_DIR . '/' . $_GET['doc'] . '.jpg';

		header('Content-type: application/octet-stream');
		header('Content-Disposition: attachment; filename='.$_GET['doc'] . '.jpg');
		if ( ($fp = fopen($filename,'rt')) ) {
			fpassthru($fp);
			fclose($fp);
		}
		else
			echo 'Impossible d\'ouvrir le fichier suivant: '.$_GET['doc'] . '.jpg';
	}
	exit();
?>

Appel: <a href="telecharge.php?doc=screenshot800600">Télécharger screenshot800600.jpg</a>

Appel d'une image JPG dans un répertoire:
<a href="telecharge.php?doc=moi&amp;dir=photos">Télécharger photos/moi.jpg</a>