Envoyer un fichier au navigateur en php
Modif 28/06/2010: Envoi du type mime au navigateur.
Modif 28/06/2010: Mon script de 19 lignes seulement ouvrait une faille permettant de remonter les dossiers, expliquée là. Correction
Je souhaite pouvoir envoyer un fichier via un script php au navigateur. C'est à dire que l'URL de ce dernier sera du genre : http://www.blog-du-grouik.tinad.fr/fichier.php?filename=nomdufichier.plop
l'intéret est par exemple de pouvoir autoriser ou non le téléchargement du fichier. On peut imaginer de fournir en fait un fichier différent en fonction du navigateur ou de la langue etc...
Tout d'abord, je créé un repertoire sur mon site nommé fichiers, dans lequel je place un pdf pour les tests. http://blog-du-grouik.tinad.fr/fichiers/la-rose-et-le-reseda.pdf
A présent, comme je ne souhaite pas que les gens y aient accès, j'ajoute un .htaccess qui contient basiquement ça:
order deny,allow deny from all
je teste le lien ci dessus, et je tombe sur la page forbidden. Ça tombe bien c'est ce que je voulais.
A présent, le script php. la fonction principale est header()
<?php //tester si le fichier existe if((!file_exists("fichiers/".$_GET['filename'])) OR (strpos($_GET['filename'],'..')!==false)) { //ce n'est pas le cas, on envoit l'header 404 header("HTTP/1.0 404 Not Found"); echo file_get_contents("404/404.htm"); //puis on quitte le script die; } //on indique le mime (type) du fichier header('Content-type: '.mime_content_type('fichiers/'.$_GET['filename'])); //on indique le nom du fichier: header('Content-Disposition: attachment; filename="'.$_GET['filename']); //on envoie le fichier source readfile("fichiers/".$_GET['filename']); ?>
test: http://blog-du-grouik.tinad.fr/fichiers.php?filename=la-rose-et-le-reseda.pdf
ça marche tadaaam
Pour la petite explication, le .htaccess est un paramétrage du serveur web apache, qui bloque l'envoi en http ou https, mais il ne bride pas l'user unix utilisé par php (www-data).
J'en avais besoin pour la GED, je retourne coder.