8792 sujets

Développement web côté serveur, CMS

Bonjour tout le monde Smiley smile

Le contexte :
Sur mon site en développement je récupère les sessions du forum. De cette façon je restreins l'accès à certaines zones du site en fonction des groupes créé. Ces groupes auront accès à des téléchargements privés, mais je ne veux pas que les liens de téléchargement soient divulgués.

On m’a parlé de readfile() mais je ne vois pas quoi faire avec ça, même avec la doc de php.net

Vous pourriez me donné un exemple de code dans mon cas ? (la plupart des fichiers font moins de 5 Mo)


Merci d’avance Smiley biggrin
Modifié par Spark (23 Sep 2007 - 18:45)
Readfile lit un fichier et l'envoie à la sortie.

Ainsi si tu fais une page foo.php avec le code :


<?php
header("Content-Type:audio/mpeg");
readfile("fichier.mp3");
?>


Personne ne pourra connaître l'URL exacte du mp3.
Tu peux évidemment mettre ce que tu veux dans ton php, ainsi donc tu peux refuser le téléchargement si les conditions ne sont pas respectés.
Ouai mais je le fait cliquer sur quoi moi le surffeur pour qu'il télécharge le fichier ???
Bonsoir,

Comme QuentinC expliquait dans le post précédent.
Tu peux utiliser readfile() dans un fichier PHP que tu nommes par exemple son.php

Tu appelles tout simplement cette page (son.php).
ok je viens de comprendre, le liens c'est foo.php ! Je viens de testé, et le problème c'est que justement c'est foo.php qui est téléchargé, il faut donc renommé foo.php en => fichier.mp3 une fois le téléchargement terminé.

EDIT : je pense faire une truc dur genre : fichier.mp3.php, mais il n'y a pas un moyen pour que le fichiers téléchargé port le nom d'orrigine ?

Dans mon cas ca sera des archives .cab et 7z que devrais-je mettre à la place de header("Content-Type:audio/mpeg"); ???
Modifié par Spark (05 Dec 2006 - 18:32)
Hello Spark.
Non, il ne faut pas faire en sorte que ce soit ton fichier .php qui se télécharge, c'est lui qui va contenir la fonction 'readfile()' qui va elle initialiser le téléchargement du fichier.

Le contenu de ton fichier PHP qui va forcer le téléchargement :
<?php
$url = '/ton_fichier.mp3';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($url) .'";');
header('Content-Length: '. filesize($url));
@readfile($url) OR die();
?>

Il te suffit alors à faire appel à ce fichier PHP (via un lien normal par exemple mais pas par un include() hein Smiley langue ) et le tour est joué !

Sinon tu as de bonnes infos sur la page http://fr.php.net/readfile

Courage Smiley cligne
Modifié par Christopher (05 Dec 2006 - 18:45)
Ha oui y'a encore un petit détail Smiley confused

Mon fichier qui force le téléchargement va chercher les fichiers à téléccharger dans un dossier protégé par un .htaccess (deny from all) ce qui ne pose aucun problème puisque le serveur lui y aura accès.

Mais mais mais ...

On est sur 2 serveurs ! Le fichier qui force le téléchargement sur le serveur A
Et les fichiers sur le serveur B !

Ma question est donc :

Est ce que je peux mettre une protection par mot de passe au serveur B avec .htaccess et .htpasswd
Et dans ma page PHP qui va aller lire les fichiers à télécharger, lui donner le login et mot de passe pour qu'il obtienne l'accès ? Un peut comme comme on se connecte à une BDD
Administrateur
Bonjour,

quand un script veut accéder à une page/fichier protégée, la bibliothèque libcurl est parfaite pour cela (gestion des cookies, ssl, .htaccess: tout) mais là je saurais pas dire qui s'authentifie sur le serveur B. Il me semble que c'est le navigateur qui va demander le fichier au serveur B, au final. Donc curl servira à rien ... Mais je me trompe peut-être complètement Smiley confused
Pour accéder au fichier sur le serveur B protégé depuis le serveur A, en fait, il faut utiliser les sockets, envoyer une requête HTTP et récupérer le résultat.
QuentinC a écrit :
Pour accéder au fichier sur le serveur B protégé depuis le serveur A, en fait, il faut utiliser les sockets, envoyer une requête HTTP et récupérer le résultat.

Merci mais cette extension n'est pas activé sur le serveur Smiley ohwell


Felipe a écrit :
quand un script veut accéder à une page/fichier protégée, la bibliothèque libcurl est parfaite pour cela (gestion des cookies, ssl, .htaccess: tout) mais là je saurais pas dire qui s'authentifie sur le serveur B. Il me semble que c'est le navigateur qui va demander le fichier au serveur B, au final. Donc curl servira à rien ... Mais je me trompe peut-être complètement Smiley confused


Salut,

Oulaa ... ça se mange ? Smiley eek

CURL support est activé sur le serveur. Mais ça à l'ère chaud Smiley biggol

EDIT : en toute logique c'est le serveur A qui devra s'autentifier au serveur B. Puisque c'est sur le serveur (A) que le fichier sera chargé et non sur le client ??? Smiley fou
Modifié par Spark (05 Dec 2006 - 22:29)
Christopher a écrit :
Le contenu de ton fichier PHP qui va forcer le téléchargement :
<?php
$url = '/ton_fichier.mp3';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($url) .'";');
header('Content-Length: '. filesize($url));
@readfile($url) OR die();
?>

Il te suffit alors à faire appel à ce fichier PHP (via un lien normal par exemple mais pas par un include() hein Smiley langue ) et le tour est joué !

Sinon tu as de bonnes infos sur la page http://fr.php.net/readfile

Courage Smiley cligne



Et zut, ça fonctionne parfaitement, mais le problème c'est qu'en condition réelle mes fichiers à télécharger sont sur un autre serveur et j'ai donc essayé :

fichier.php :
<?php
$url = 'http://www.mandomaine.com/telecharger/ton_fichier.mp3';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($url) .'";');
header('Content-Length: '. filesize($url));
@readfile($url) OR die();
?>


Mais ça ne fonctionne pas. J'ai pensé déplacer le fichier fichier.php sur l'autre serveur, mais je dois récupérer les sessions du forum, je ne peux donc pas faire ça.

Avez vous une idées ??? Smiley bawling
Modifié par Spark (07 Dec 2006 - 01:34)
4 heures de google et une dizaine de tonneaux de bierre plus tard ...


Bon j'ai plus d'infos, les fichiers se télécharge bien ! Sauf que ... un message d'erreur viens s'incruster dedans et les fichiers .cab ne support pas ça, contrairement au fichier .7z qui ne sont pas corrompu pour autant.

Voici le message :

<br />
<b>Warning</b>:  filesize(): Stat failed for  http://www.mondomaine.org/dossier/fichier.7z  (errno=2 - No such file or directory) in <b>t:\sites perso\site\download\fichiers.php</b> on line <b>7</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at t:\sites perso\site\download\fichiers.php:7) in <b>t:\sites perso\site\download\fichiers.php</b> on line <b>7</b><br />
7z¼¯'7z¼¯'7z¼¯'7z¼¯'7z¼¯'7z¼¯'7z¼¯'7z¼¯'7z¼¯'



Les caractères bizarre c'est là où commence réellement le fichier.


J'allais oublier fichier.php :
$_GET['id'] = fichier.7z

<?php

$url = ('http://www.mondomaine.org/dossier/' . $_GET['id']);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($url) .'";');
header('Content-Length: '. filesize($url));
@readfile($url) OR die();

?>

Ligne 7 :
header('Content-Length: '. filesize($url));

Testé sous Firefox, Internet Explorer et Opera


J'espère vraiment que quelqu'un parmis vous c'est de quoi il s'agis Smiley decu



EDIT :
Le message d'erreur incrusté dans le fichier que je vous est montré, c'est en local, online c'est légèrement différent :

<br />
<b>Warning</b>:  filesize() [<a href='function.filesize'>function.filesize</a>]: Stat failed for  http://www.mondomaine.org/dossier/fichier.7z  (errno=2 - No such file or directory) in <b>/home.4/c/r/e/MonSiteSurUnAutreDomaine/www/dossier/fichier.php</b> on line <b>7</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home.4/c/r/e/MonSiteSurUnAutreDomaine/www/dossier/fichier.php:7) in <b>/home.4/c/r/e/MonSiteSurUnAutreDomaine/www/dossier/fichier.php</b> on line <b>7</b><br />

Modifié par Spark (07 Dec 2006 - 01:32)
Normal, tu n'es pas censé pouvoir récupérer la taille d'un fichier qui ne se trouve pas sur ton serveur.
QuentinC a écrit :
Normal, tu n'es pas censé pouvoir récupérer la taille d'un fichier qui ne se trouve pas sur ton serveur.

Ha bon ok, et bien il n'y a plus qu'a supprimer cette ligne, je pensais qu'on était obligé de la mettre Smiley smile


Merc Smiley lol
Bonjour,

J'ai un pb similaire : en fait dans mon cas il s'agit de sécuriser un dossier de mp3 qui se lisent dans un player flash. Donc j'ai effectivement tenté d'appeler mes mp3 dans mon flash en utilisant une page php qui récupère le fichier mp3 sous cette forme :

$file=$_GET["id"].".mp3";
$url="mp3/".$file;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename$url) .'";');
header('Content-Length: '. filesize($url) .'');
@readfile(''.$url.'');


Mais pour le moment c'est complètement raté !

Quelqu'un a-t-il une idée pour me débloquer ?

Merci c'est super urgent.
Je me suis débloqué tout seul. En fait dans la suite de mes essayes pour résoudre le problème, j'avais changé les droits sur le dossier des mp3. Les droits étaient à 773 et ils fallait les avoir à 777.

En espérant que ça puisse aider quelqu'un...

Bonne nuit !
Spark a écrit :

Ha bon ok, et bien il n'y a plus qu'a supprimer cette ligne, je pensais qu'on était obligé de la mettre Smiley smile


Merc Smiley lol



Et patatra catastrophe Smiley lol

J'ai besoin de récupérer la taille du fichier même si il est sur un autre serveur !

Vous avec une idée ? Sur le net ça dit partout à peut près la même chose !



EDIT : c'est pas grave, on va faire autrement.


Merci à tous le monde !! Smiley smile
Modifié par Spark (08 Dec 2006 - 19:03)