[Résolu][Php] Problème explorateur de fichiers (lecteur réseau)

Problème explorateur de fichiers (lecteur réseau) [Résolu][Php] - PHP - Programmation

Marsh Posté le 19-02-2003 à 15:36:24    

Bonjour à tous,
 
Ca fait deux jours que je me prends la tête dessus et ne trouve pas de solution :/
 
Afin d'exploiter des données communes stockées sur un lecteur réseau (autre que le serveur Apache), j'ai créé un petit module d'exploration de fichiers.
 
Donc voilà mon problème ...
La navigation se passe très bien (changement de répertoire, remonter, etc ...), par contre dès que je clique sur un fichier, afin de lancer le téléchargement de celui-ci, le navigateur ne trouve pas ce fichier (normal puisque seul mon serveur apache connaît le chemin).
 
Donc existe-t-il une manière de contourner ce problème afin que ce soit bien mon serveur qui lance le téléchargement de fichier, vers le client, et non pas le client qui essaye de le faire directement ?
 
Voici le code de mon explorateur :
 

Code :
  1. <?
  2.    echo "<p align=\"left\">";
  3.    if(is_null($Directory)){
  4. $Directory="I:/maRacineLecteurRéseau";
  5.    }
  6.    if (is_dir($Directory) and is_readable($Directory)) {
  7.      /*-----------------------------------------------*/
  8.      /*----- Ouverture et parcours du répertoire -----*/
  9.      /*-----------------------------------------------*/
  10. if (!$fp = opendir($Directory)) {
  11. echo "Echec de l'ouverture du fichier";
  12. exit;
  13. }else{
  14.  if($Directory != "I:/maRacineLecteurRéseau" ){
  15.        /*-----------------------------------------------*/
  16.        /*--------- Est-on à la racine ou non ? ---------*/
  17.       /*-----------------------------------------------*/
  18.  $longueur= strrpos($Directory, '/');
  19.  $chaine_result = substr($Directory, 0, $longueur);
  20.                 //On est pas à la racine, on met le lien afin de pouvoir remonter d'un répertoire
  21.  echo '<b>Répertoire courant :</b><br> '.$Directory."<br><br>";
  22.  echo "<img src=\"images/dossier.gif\"> <a href=\"documentation.php?Directory=".$chaine_result."\" class=\"liendoc\">..</a><br>";
  23.  } else {
  24.                 //On est à la racine, donc on ne met pas le lien qui permet de remonter d'un répertoire
  25.  echo '<b>Répertoire courant :</b><br> '.$Directory."<br><br>";
  26.  }
  27.       /*-----------------------------------------------*/
  28.  while($Entry = readdir($fp)) {
  29.   if (is_dir($Directory."/".$Entry)) {
  30.    if (($Entry != "." ) && ($Entry != ".." )) {
  31.     echo "<img src=\"images/dossier.gif\"> <a href=\"documentation.php?Directory=".$Directory."/".$Entry."\" class=\"liendoc\">$Entry</a><br>\n";
  32.    }
  33.   }
  34.   else {
  35.    echo "<img src=\"images/carre_rouge.gif\"> <a href=\"http://10.155.104.145/".$Directory."/".$Entry."\" target=\"_new\" class=\"liendoc\">$Entry</a>"."<br>";
  36.        }
  37.  }
  38. }
  39. closedir($fp);
  40.      /*-----------------------------------------------*/
  41.    echo "</p>";
  42.    } else {
  43.    echo "Lecteur réseau indisponible !";
  44.    echo "</p>";
  45.    }
  46. ?>


Message édité par Notsukaw le 20-02-2003 à 12:23:29

---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 19-02-2003 à 15:36:24   

Reply

Marsh Posté le 19-02-2003 à 15:40:21    

Notsukaw a écrit :

Donc existe-t-il une manière de contourner ce problème afin que ce soit bien mon serveur qui lance le téléchargement de fichier, vers le client, et non pas le client qui essaye de le faire directement ?


 
Bin tu passes par un script PHP [:joce]
C'que j'veux dire, c'est qu'au lieu de mettre un lien direct vers le document, tu mets un lien vers un script download.php qui fait tout ce qu'il a à faire comme traitement avant de rediriger l'utilisateur vers le download du fichier en lui-même. Non ?

Reply

Marsh Posté le 19-02-2003 à 16:15:17    

Taiche a écrit :


 
Bin tu passes par un script PHP [:joce]
C'que j'veux dire, c'est qu'au lieu de mettre un lien direct vers le document, tu mets un lien vers un script download.php qui fait tout ce qu'il a à faire comme traitement avant de rediriger l'utilisateur vers le download du fichier en lui-même. Non ?


 
Ouep ça je sais bien, mais je vois pas justement les traitements qu'il faut faire afin que le download soit possible :/
 
Créer à chaque fois sur le serveur une copie temporaire du fichier qu'on veut télécharger et ensuite balancer le téléchargement de ce fichier tempo (puisque là le client arrivera à le trouver) ? Ca me parait laborieux comme technique mais pour l'instant j'en vois pas d'autre :/


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 19-02-2003 à 16:22:29    

Notsukaw a écrit :


Créer à chaque fois sur le serveur une copie temporaire du fichier qu'on veut télécharger et ensuite balancer le téléchargement de ce fichier tempo (puisque là le client arrivera à le trouver) ? Ca me parait laborieux comme technique mais pour l'instant j'en vois pas d'autre :/


 
Bin oui [:spamafote]
Faudrait un système de callback pour que le serveur sache quand le client a fini son download mais j'ai pas ça sous la main.
Au pire, tu fais un script qui vire tous les fichiers qui ont plus d'1h de vie, mais franchement c'est de la grosse bidouille à deux balles.
 
Si quelqu'un a une solution propre, ça m'intéresse aussi, chu curieux de savoir :)

Reply

Marsh Posté le 19-02-2003 à 22:58:50    


 Une solution envisageable :
Créer un script php (ici, dl.php) qui prend en paramètre le nom du fichier à charger avec son chemin complet (que j'appelle $fic), du point de vue du serveur ($fic=$Entry;  ou $fic=$Directory.$Entry;  si je saisis votre script) et changer la balise <a href> (celle dans la boucle while, après l'image "carre_rouge.gif" ) par ceci :
 
---...
<a href="dl.php?fichier=$fic"> $fic </a>
---
 
(faut ajouter les guillemets, slashs et anti-slashs nécessaires)
 
et le script dl.php ressemble à ça :
 
---------- dl.php -----------
<?php
     $filename=$_GET["fichier"];
     $sendname=basename($filename);
 
     header("Cache-control: private" ); // fix for IE
     header("Content-Type: application/octet-stream" );
     header("Content-Length: ".filesize($filename));
     header("Content-Disposition: attachment; filename=$sendname" );
     $fp = fopen($filename, 'r';);
     fpassthru($fp);
     // fclose($fp);  // Inutile avec fpassthru ?
?>
-----------------------------
 
Ca vient principalement des contributions des utilisateurs dans la doc php sur la fonction header :
http://www.php.net/manual/fr/function.header.php
 
 Bien sur, il faut faire quelques vérifications sur $filename, afin de ne pas laisser charger n'importe quoi (comme ça brut, un utilisateur mal intentionné pourrait taper dans son navigateur "http://url/dl.php?fichier=c:/windows/system.dat" ou je ne sais quel fichier représentant la base de registre pour le récupérer et pourrait l'analyser pour éventuellement récupérer des infos sur les utilisateurs)
 
 Remarque : si le client est Mozilla 1.0 ou 1.1, la boite de dialogue pour sauvegarder le fichier ajoute l'extension .php, quelque soit le type du fichier ; pour éviter ce comportement, je crois qu'il faut ajouter '/' avant le '?' dans le <a href> :
<a href="dl.php/?fichier=$fic"> $fic </a>
Mozilla 1.2.1 résoud ce problème (au moins sous Linux)
 

Reply

Marsh Posté le 20-02-2003 à 01:04:03    

unk00 a écrit :


 Une solution envisageable :
Créer un script php (ici, dl.php) qui prend en paramètre le nom du fichier à charger avec son chemin complet (que j'appelle $fic), du point de vue du serveur ($fic=$Entry;  ou $fic=$Directory.$Entry;  si je saisis votre script) et changer la balise <a href> (celle dans la boucle while, après l'image "carre_rouge.gif" ) par ceci :
 
---...
<a href="dl.php?fichier=$fic"> $fic </a>
---
 
(faut ajouter les guillemets, slashs et anti-slashs nécessaires)
 
et le script dl.php ressemble à ça :
 
---------- dl.php -----------
<?php
     $filename=$_GET["fichier"];
     $sendname=basename($filename);
 
     header("Cache-control: private" ); // fix for IE
     header("Content-Type: application/octet-stream" );
     header("Content-Length: ".filesize($filename));
     header("Content-Disposition: attachment; filename=$sendname" );
     $fp = fopen($filename, 'r';);
     fpassthru($fp);
     // fclose($fp);  // Inutile avec fpassthru ?
?>
-----------------------------
 
Ca vient principalement des contributions des utilisateurs dans la doc php sur la fonction header :
http://www.php.net/manual/fr/function.header.php
 
 Bien sur, il faut faire quelques vérifications sur $filename, afin de ne pas laisser charger n'importe quoi (comme ça brut, un utilisateur mal intentionné pourrait taper dans son navigateur "http://url/dl.php?fichier=c:/windows/system.dat" ou je ne sais quel fichier représentant la base de registre pour le récupérer et pourrait l'analyser pour éventuellement récupérer des infos sur les utilisateurs)
 
 Remarque : si le client est Mozilla 1.0 ou 1.1, la boite de dialogue pour sauvegarder le fichier ajoute l'extension .php, quelque soit le type du fichier ; pour éviter ce comportement, je crois qu'il faut ajouter '/' avant le '?' dans le <a href> :
<a href="dl.php/?fichier=$fic"> $fic </a>
Mozilla 1.2.1 résoud ce problème (au moins sous Linux)
 
 


 
 :hello:  :jap: J'essaye ça demain et je vous tiens au courant :jap:


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 20-02-2003 à 11:13:27    

:bounce: Putain ça marche presque !!!  :bounce:  :pt1cable:  
 
Il me lance bien le téléchargement, mais en fait ça foire au niveau de la fin de la transmission, donc je n'obtiens que des fichiers corrompus, mais il manque pas grand chose je sens.
 
 :hello:


Message édité par Notsukaw le 20-02-2003 à 11:18:40

---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 20-02-2003 à 12:22:26    

Ayé c'est bon ça fonctionne comme ça :
 

Code :
  1. <?php
  2.      $filename=$_GET["fichier"];
  3. if(strtok($fichier,":" ) != "I" ){
  4.  include('corps_entete.php');
  5.  echo "Tssss tu crois m'avoir aussi facilement ? ;o)";
  6.  include('corps_pied.php');
  7. }else{
  8.      $sendname=basename($filename);
  9.       header("Cache-control: private" ); // fix for IE
  10.       header("Content-Type: application/octet-stream" );
  11.       header("Content-Length: ".filesize($filename));
  12.       header("Content-Disposition: attachment; filename=$sendname" );
  13.  header("Pragma: no-cache" );
  14.  header("Expires: 0" );
  15.       readfile($fichier);
  16.  exit();
  17.      }
  18. ?>


 
:hello:


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed