Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2241 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°313152
Notsukaw
Be Aware
Posté le 19-02-2003 à 15:36:24  profilanswer
 

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]
mood
Publicité
Posté le 19-02-2003 à 15:36:24  profilanswer
 

n°313158
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 19-02-2003 à 15:40:21  profilanswer
 

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 ?

n°313191
Notsukaw
Be Aware
Posté le 19-02-2003 à 16:15:17  profilanswer
 

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]
n°313201
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 19-02-2003 à 16:22:29  profilanswer
 

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 :)

n°313588
unk00
Posté le 19-02-2003 à 22:58:50  profilanswer
 


 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)
 

n°313662
Notsukaw
Be Aware
Posté le 20-02-2003 à 01:04:03  profilanswer
 

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]
n°313849
Notsukaw
Be Aware
Posté le 20-02-2003 à 11:13:27  profilanswer
 

: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]
n°313933
Notsukaw
Be Aware
Posté le 20-02-2003 à 12:22:26  profilanswer
 

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]

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Probleme de bufferproblème incroyable.... [RESOLU]
CSS, problème en étant passé de IE5.5 à IE6Problème session en ASP.NET/C#
[Php/Apache] Cryptage MD5 différent ??problème avec org.postgresql.Driver
[PHP] faire une requete sur une "plage d'ip"...Pb lors de la transformation XSL d'un document XML via PHP
Probleme de requette sur mysql 
Plus de sujets relatifs à : [Résolu][Php] Problème explorateur de fichiers (lecteur réseau)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR