Partage
  • Partager sur Facebook
  • Partager sur Twitter

Explorateur de fichier

Onclick et pathname (chemin)

    3 mars 2010 à 11:36:04

    Salut à tous.

    Tout d'abord, je tenais à remercier tous les membres de ce site qui participent à l'évolution et l'entraide de chacun de nous ;)

    Cela fait un moment que j'utilise les tutos et le forum pour résoudre mes petits problèmes.
    Actuellement en stage de 2e année d'IUT Informatique, je m'attaque maintenant à un plus gros projet, et viens solliciter votre aide pour les quelques lacunes que je rencontre face à mon module...

    Étant programmeur avant d'être analyste, je n'ai pas encore reproduit les diagrammes d'analyse sous 'Objecteering' ^^
    Quelques explications feront office de cahier des charges!

    Comme je ne savais pas trop où poster, je me suis dit qu'ici serait le mieux. J'utilise les langages html, php et javascript. Et mon principal problème concerne la partie javascript du fichier tree.js et dossierCourant.php.
    Je teste l'affichage sous Firefox, mais par soucis de compatibilité, le site doit aussi tourner sous Internet Explorer.


    IoExplorer a pour but de faciliter les interactions entre l'entreprise et ses clients.
    Grâce à un login/mot de passe (géré par la table membre de ma Base De Données), l'utilisateur peut:
    • Consulter son répertoire personnel
    • Charger un fichier (upload)
    • Télécharger un fichier (download)
    • Envoyer un mail
    • Et à terme, copier-couper/coller (gestion de son répertoire perso)


    Les administrateurs, en plus des possibilités énumérées ci-dessus, peuvent:
    • Accéder non pas au répertoire personnel, mais au dossier 'BDD' contenant tous les répertoires des utilisateurs
    • Créer un compte (client/admin)
    • Modifier un compte


    La base de mon module est déjà codée (merci aux codes sources, tutos et manuels disponibles sur les différents sites [phpcs.com, asp-php.net, commentcamarche.net, toutjavascript.com, jejavascript.net sans oublier lesiteduzero.com et mon ami Google] ^^ )

    Cependant, malgré l'adaptation du code source 'tree.js' qui permet d'afficher récursivement le contenu de mon répertoire ('./BDD' pour les admins et './BDD/$login' pour les clients), je bute sur le onclick ligne 190 et n'arrive pas à mes fins.
    Je voudrai récupérer le chemin (pathname) du répertoire ou fichier cliqué afin d'afficher (en mode Miniatures/Mosaïques/Détails [au choix]) le dossier courant. HELP PLEASE!!! :-°

    Ensuite, j'ai un problème de requête SQL dans le fichier formulaireChargerFichier.php ligne 25: $reqAllLog ne fonctionne pas comme je voudrai... sous phpmyadmin en mode SQL, la requête renvoie la liste de tous les login présent dans la table, mais dans le tableau (ligne 27) seul le premier indice est affiché (et deux fois en plus o_O ).

    Pour finir, le clic droit n'est pas effectif dans l'iframe alors que c'est là qu'il est important pour le téléchargement puisque à terme je veux récupérer le chemin du fichier cliqué pour l'envoyer vers telechargerFichier.php.
    Une idée?


    Le .zip est disponible ici
    J'ai exporté la Base De Données en fichier texte dans le dossier ./IoExplorer/BDD/ioexplorer.txt ('importable' facilement sur mysql).


    Merci d'avance à tous ceux qui se pencheront sur mon projet, et espère avancer grâce à vous.
    Bonne journée.
    Cordialement.
    Robin.
    • Partager sur Facebook
    • Partager sur Twitter
      3 mars 2010 à 11:58:13

      + 'onclick="javascript: alert(\'' + chemin + '/' + nom + '\'); formulaireSubmit(\''+ nom +'\'); refreshPageActive();">' + nom + '</a></tr></table></td>'
      


      ?
      • Partager sur Facebook
      • Partager sur Twitter
        3 mars 2010 à 12:07:49

        Salut et merci pour ta réponse rapide!

        'onclick="javascript: formulaireSubmit('+ chemin +'); refreshPageActive();">' + nom + '</a></tr></table></td>'
        


        Yep ca fonctionne!
        Mais le problème viens de la réception du chemin dans dossierCourant.php :(
        • Partager sur Facebook
        • Partager sur Twitter
          3 mars 2010 à 12:10:40

          Mais, tu voudrais qu'on lise les 29 fichiers de ton site pour comprendre le fonctionnement ?

          Tu peux pas ciblé un peu mieux les problèmes et en détaillant ce qu'il se passe ou pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            3 mars 2010 à 15:29:16

            Oui, désolé j'ai la tête dans ce projet depuis prêt d'un mois, et je n'ai pas réalisé qu'il y avait autant de fichier et que mon problème ne serait pas compréhensible au premier coup d'œil...
            Autant pour moi :p

            Alors, je vais essayer de faire simple!
            Dans 'tree.js' j'ai fait une petite fonction ligne 146 'formulaireSubmit(chemin)' qui crée un formulaire, récupère le chemin dans le <input type="text" name="path"> et l'envoi à dossierCourant.php (copie presque conforme de arborescence.php pour le moment).
            Je ne sais pas si 'this.form.submit()' est réellement prit en compte (malgré le test d'affichage que j'ai réalisé: '//+ document.write("ok");'

            En effet, dans dossierCourant.php, 'if(isset($_POST['path']))' ne passe pas. Et c'est là qu'est mon principal problème :euh:

            De plus, depuis la modification de tree.js (ligne 190) de '+ nom +' à '+ chemin +', le refresh ne marche plus :colere2:
            onclick="javascript: formulaireSubmit(' + chemin +'); refreshPageActive();"
            


            Pour ce qui en est de la requête SQL, je pense avoir tout dit (et j'ai commenté le code dans formulaireChargerFichier.php à partir de la ligne 25).

            Pour le clic droit, l'erreur n'est pas à une ligne précise, mais "l'appel" de clickDroit.js se fait dans index.php ligne 10, et l'appel de la fonction 'afficheMenu()' ligne 87
            Y a-t'il un quelque chose de particulier à faire pour l'iframe?

            En espérant que vous ayez des idées... :D
            • Partager sur Facebook
            • Partager sur Twitter
              3 mars 2010 à 16:09:20

              1.

              function formulaireSubmit(chemin)
              {
              	return '<form name="formClick" method="POST" action="dossierCourant.php">'
              	+ '<input type="text" name="path" value="' + chemin + '">'
              	+ 'this.form.path.value= chemin'
              	+ '<input type="submit" value="Envoyer">'
              	+ '</form>'
              	+ 'this.form.submit()';
              	//+ document.write("ok");
              }
              


              Je comprend pas ce qu'est censé faire ton this.form.submit là ? C'est juste une chaine de caractères, c'est tout sauf du javascript, le texte "this.form.submit()" sera écrit en même temps que le formulaire.

              2.
              onclick="javascript: formulaireSubmit(' + chemin +'); refreshPageActive();"
              


              Deja, psa de "javascript:" dans les onclick et compagnie.
              Ensuite, ton truc est faux la. Car une fois que tu auras écris ce truc, t'auras genre :
              onclick="formulairesubmit(/home/tiller/);"
              


              Or /home/tiller/ en javascript c'est rien du tout, c'est même une erreur, donc tu dois prendre la chaine de caractère '/home/tiller/'

              Donc :
              onclick="formulaireSubmit(\'' + chemin +'\'); refreshPageActive();"
              


              Et mets une alert dans refreshPageActive voir si elle est appellé ou non.
              • Partager sur Facebook
              • Partager sur Twitter
                3 mars 2010 à 17:12:21

                Re!
                Merci encore pour le temps que tu accordes à mon problème...

                Ne m'en veux pas trop si je fais de grosses bourdes, j'ai apprit à programmer en .ada et en .java!
                Je découvre le .php et .js au fil du développement de mon module alors soit un peu indulgent :-°

                J'ai fait les modifs: (supprimé ':javascript' et ajouté \' avant et après la variable)
                + 'onclick="formulaireSubmit(\'' + chemin +'\');
                

                Du coup, le rafraichissement fonctionnait à nouveau, mais... (NB)

                Bien vu pour le submit(), je pensais que le formulaire était 'interprété et que le submit() fonctionnerait aussi... mais tu m'as démontré le contraire!

                J'ai donc fait une petite fonction à coté:
                function formulaire(chemin)
                {
                	return '<form name="formClick" method="POST" action="dossierCourant.php">'
                	+ '<input type="text" name="path" value="' + chemin + '">'
                	+ 'this.form.path.value= chemin'
                	+ '<input type="submit" value="Envoyer">'
                	+ '</form>';
                }
                function submitForm()
                {
                	document.forms['formClick'].submit();
                	//document.write("Ok");
                }
                


                mais ca ne passe pas, et (->NB) le rafraichissement ne fonctionne plus non plus puisque submitForm() n'est pas fonctionnelle (j'ai essayé un document.write("Ok"); sans résultat...)

                Ainsi, je me demande comment envoyer ce fameux formulaire jusqu'à dossierCourant.php !!??
                La fonction formulaire(chemin) doit-elle vraiment avoir un return (puisque on retourne une chaine de caractères) ou peut-on faire autrement?
                • Partager sur Facebook
                • Partager sur Twitter
                  3 mars 2010 à 19:38:58

                  Deja, oublie document.write.

                  Ensuite, je n'y avais pas fait attention, mais t'as encore une ligne "de javascript" qui traine dans ce que t'écris. Ton this.form.path.value = chemin ne marchera jamais car ce n'est que du texte.

                  Ensuite je comprend pas du tout l'utilité de ta fonction submitForm car :
                  1. Jamais tu n'appelles cette fonction
                  2. Dans ton formulaire t'as mis un input type="submit", donc le formulaire se submitera seul.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 mars 2010 à 21:08:43

                    Bonsoir
                    Je n'ai pas bien compris à quoi sert ton formulaire.
                    Apparemment tu demandes l'adresse du dossier si c'est le cas pourquoi ne crée tu pas ton formulaire directement dans ta page php et tu le masques (ou pas) avec style.display=none et style.display="".
                    Enfin je dis ca je dis rien...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 mars 2010 à 10:15:35

                      Bonjour! :)

                      Citation : Tiller

                      this.form.path.value = chemin ne marchera jamais car ce n'est que du texte.

                      1. Jamais tu n'appelles cette fonction
                      2. Dans ton formulaire t'as mis un input type="submit", donc le formulaire se submitera seul.



                      Ok pour le this.form.path.value (puisque j'assigne directement la value dans le formulaire une ligne au dessus...) :-°

                      + '<input type="text" name="path" value="' + chemin + '">'
                      


                      Pour ma fonction submitForm() je l'ai bien évidement appelée dans le onclick... Je suis débutant mais pas complétement abrutis! o_O

                      Ensuite, le input type="submit" n'envoie les données que si on clique sur le bouton... Je me trompe?
                      ____________________________________________________________________________
                      ____________________________________________________________________________

                      Citation : Abraksas

                      pourquoi ne crée tu pas ton formulaire directement dans ta page php



                      J'ai suivit ton conseil, j'ai rajouté le formulaire dans fonctionsArborescence.php:
                      function Formulaire($chemin)
                      {
                      	echo "<form name='formClic' method='POST' action='dossierCourant.php'>";
                      	echo "<input type='text' name='path' value=$chemin>";
                      	echo "<input type='submit' value='Envoyer'>";
                      	echo "</form>";
                      }
                      


                      Le problème, c'est que je connais la variable qui détient le pathname dans tree.js, mais pas dans arborescence.php...
                      Quand j'appelle ma fonction Formulaire($variable), c'est le $variable qui m'embête!
                      Par défaut pour tester, j'ai mis $dir en paramètre (soit './BDD'). Quand j'envoie, dossierCourant.php affiche bien le contenu de $dir (donc la base de mon répertoire). Jusque là c'est tout bon et c'est fonctionnel.
                      Maintenant, ce que je ne sais pas, c'est comment (et pourquoi) récupérer le chemin dans le onclick de tree.js pour l'envoyer vers arborescence.php et pour ensuite le transmettre à dossierCourant.php !!??

                      En espérant avoir vos idées, je vous souhaites une bonne matinée ;)

                      EDIT:
                      J'ai uploadé le .zip à nouveau, et j'ai mis à jour le lien dans le premier post.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 mars 2010 à 14:18:36

                        Si tu as besoin de connaitre ton chemin dans beaucoup de pages pourquoi ne le stocke tu pas dans une variable session ou un truc du genre? Ou alors tu regroupe arborescence et dossier courant.php.

                        Citation : redgable

                        Maintenant, ce que je ne sais pas, c'est comment (et pourquoi) récupérer le chemin dans le onclick de tree.js pour l'envoyer vers arborescence.php et pour ensuite le transmettre à dossierCourant.php !!??


                        Si tu ne sais pas pourquoi c'est que logiquement tu n'en a pas besoin...
                        J'ai essayé de lire ton code mais c'est pas très clair. Ce que je n'ai pas compris c'est:
                        comment ton chemin est connu? es ce l'utilisateur qui le remplit? ou c'est en cliquant su une ligne qu'un autre chemin est généré comme dans les explorateur de fichier?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mars 2010 à 14:46:29

                          Salut!

                          Alors, tout d'abord, regrouper arborescence et dossierCourant risque de poser problème... En effet, j'ai créer une iframe pour la 'page active' qui affiche différente page selon les choix de l'utilisateur (accueil, inscription/modification d'un compte, chargement/téléchargement de fichier, mail et dossierCourant).
                          Elle (l'iframe) est très utile puisque facilement rechargeable sans recharger le reste de la page!

                          Pour ce qui en est d'une éventuelle variable de session, dans arborescence.php, le répertoire de base (./BDD) est ouvert et c'est l'arbre (tree.js) qui se charge d'afficher les sous répertoires et fichiers.
                          Je me vois mal créer une variable de session pour chaque ligne (donc sous répertoire) et je ne sais pas faire ca en javascript...

                          D'où l'idée de récupérer le chemin sur le onclick!

                          Citation : Abraksas

                          comment ton chemin est connu? es ce l'utilisateur qui le remplit? ou c'est en cliquant su une ligne qu'un autre chemin est généré comme dans les explorateur de fichier?



                          Je ne sais pas comment cela fonctionne dans les explorateurs de fichier, mais dans mon tree.js la variable chemin est connue. Alors arborescence.php se contente d'appeler les fonctions de fonctionsArborescence.php

                          Donc, en cliquant sur une ligne (onclick de la ligne 190 de tree.js) j'aimerai récupérer le chemin (ce que je crois faire dans mon formulaire), et le renvoyer vers dossier courant...

                          HELP :euh:
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mars 2010 à 15:20:49

                            Je dis peut etre une betise mais vu que tu as besoin de chemin dans dossier courant pourquoi n'essaierai tu pas de faire une fonction ajax qui envoie chemin a dossier courant et dossier courant se charge de faire le boulot
                            ou alors tu peux essayer d'appeler dossier courant.php dans ta fonction javascript et de lui donner le chemin en variable get il doit forcément y avoir un moyen de faire ca en javascript.
                            je pensais à un truc du genre:
                            appel de la page en javascript(http://dossiercourant.php?chemin=tonchemin)

                            EDIT:
                            pour appeler une page php via javascript tu fais:
                            document.location="dossiercourant.php?chemin=" + chemin;
                            

                            La deuxieme solution me parait beaucoup mieux
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 mars 2010 à 15:31:43

                              Citation : Abraksas

                              Je dis peut etre une betise mais vu que tu as besoin de chemin dans dossier courant pourquoi n'essaierai tu pas de faire une fonction ajax qui envoie chemin a dossier courant et dossier courant se charge de faire le boulot


                              Pas du tout ^^
                              J'étais même parti sur cette piste!
                              J'avais crée un fichier ajax.js, mais j'ai abandonné par manque de courage (je ne connais pas du tout les spécificités du langages). Même si j'ai comprit les bases, je n'ai pas su appliquer le tuto que j'ai trouvé à mon cas.
                              Peut-être pourrait-tu m'aider à concrétiser ca!?

                              Citation : Abraksas

                              ou alors tu peux essayer d'appeler dossier courant.php dans ta fonction javascript et de lui donner le chemin en variable get il doit forcément y avoir un moyen de faire ca en javascript.
                              je pensais à un truc du genre:
                              appel de la page en javascript(http://dossiercourant.php?chemin=tonchemin)


                              Moins bien... ^^
                              Sachant que index.php ne bouge pas malgré la navigation, c'est iframe qui se charge d'afficher le contenue qui change, et la barre d'adresse ne doit pas changer!
                              De plus, un get permettrai à un client de consulter la base du répertoire (./BDD et les répertoires des autres clients) ce qui poserait certains problèmes de sécurité :pirate:
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 mars 2010 à 15:38:50

                                si tu veux je peux te passer certains scripts que j'ai pu faire en ajax faut que je les cherche par contre:)
                                EDIT:
                                Donc j'avais fais un site du style facebook avec gestion d'albums photos le script ajax permet de supprimer un album quand on clique sur le bouton approprié
                                function Fct_remove_album(objet){
                                if(confirm("Voulez vous vraiment supprimer cet album?"))
                                {
                                id_album=objet.id;
                                obj=document.getElementById('ligne_album'+id_album);//je recupere l'id de l'album à supprimer
                                var xhr_object = null; 
                                	        if(window.XMLHttpRequest) // Firefox 
                                		xhr_object = new XMLHttpRequest(); 
                                	        else if(window.ActiveXObject) // Internet Explorer 
                                		xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
                                	        else { // XMLHttpRequest non supporté par le navigateur 
                                	        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
                                	        return; 
                                	             } 
                                    
                                	        var method   = "POST"; 
                                	        var filename = "remove_album.php";//nom du fichier a appeler   
                                //pour toi dossiercourant.php
                                	        var data     = null;//initialisation de la variable 
                                	        data = "id="+id_album;//tu mets le nom de la variable et sa valeur toi ce sera //data = "chemin="+chemin;
                                	        xhr_object.open(method, filename, true); 
                                     
                                	        xhr_object.onreadystatechange = function() { 
                                	        if(xhr_object.readyState == 4) {
                                  //quand ta page php a fini son boulot si tu veux tu peux effectuer du javascript
                                // en l'occurrence j'avais masquer le fichier qui a été supprimer
                                		if (obj.style.display != "none" ) 
                                		{ 
                                		obj.style.display='none';
                                		}
                                	        }	 
                                	        }
                                	        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                //ca c'est les directives qu'on comprend pas tout le temps:) 
                                	        xhr_object.send(data);
                                //la t'envoies tes données
                                }
                                }
                                



                                Ensuite dans ta page php tu mets ca en haut

                                header('Content-type: text/html; charset=utf-8');
                                pour pas que ca bug (c'est pareil que tes balises meta en html)
                                et puis tu fais ton code php tranquille;p

                                Bon courage
                                sinon il y avait le tuto du sdz su ajax qui était simple et clair
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 mars 2010 à 15:56:32

                                  Je vais tester ca et l'adapter!
                                  J'irai faire un tour sur le tuto...

                                  Je te tiens au courant si je bloque!

                                  Merci encore ;)

                                  EDIT:
                                  Voici donc mon tree.js.
                                  J'ai adapté un tuto que j'avais déjà modifié et j'y ai mixé ton code.

                                  function get_Xhr()
                                  {
                                  	if(window.XMLHttpRequest)
                                  	{
                                  		xhr = new XMLHttpRequest();
                                  	}
                                  	else if(window.ActiveXOject)
                                  	{
                                  		try
                                  		{
                                  			xhr = new ActiveXObject("Msxml2.XMLHTTP");
                                  		}
                                  		catch(e)
                                  		{
                                  			try
                                  			{
                                  				xhr = new ActiveXObject("Microsoft.XMLHTTP");
                                  			}
                                  			catch(el)
                                  			{
                                  				xhr = null;
                                  			}
                                  		}
                                  	}
                                  	else
                                  	{
                                  		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest\nVeuillez le mettre à jour");
                                  	}
                                  	return xhr;
                                  }
                                  
                                  function envoiChemin(chemin)
                                  {
                                  	// Nous créons un objet XMLHttpRequest
                                  	get_Xhr();
                                  
                                  	var method		= "POST"; 
                                  	var filename	= "dossierCourant.php";
                                  	var data		= null;
                                  	data 			= "chemin="+chemin;
                                  
                                  	// On ouvre la page "dossierCourant.php" en mode asynchrone (true)
                                  	xhr.open(method, filename, true); 
                                  	
                                  	xhr.onreadystatechange = function()
                                  	{
                                  		//Si la requete est terminée est qu'elle ne remonte pas d'erreur
                                  		if(xhr.readyState == 4 && xhr.status == 200)
                                  		{
                                  		// Ici on place l'action à effectuer
                                  		document.getElementById('pageActive').innerHTML = xhr.responseText;
                                  		}
                                  	}
                                  	
                                  	// Obligatoire si l'on passe en POST
                                  	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                  	//Envoie de la requete
                                  	xhr.send(data);
                                  }
                                  

                                  Et mon onclick:
                                  + 'onclick="envoiChemin(\'' + chemin +'\'); refreshPageActive();"
                                  


                                  Et l'iframe se rafraichie.
                                  <?php
                                  if (isset($_POST['chemin']))
                                  	{
                                  		$repertoire = $_POST['chemin'];
                                  		echo "Réception du chemin, OK!";
                                  		
                                  		$dir= $repertoire;
                                  		FormulaireAdresse ($dir);
                                  	}
                                  else
                                  	{
                                  		//echo "Problème de réception du chemin<br/>";
                                  		$dir="$base$repertoire";
                                  	}
                                  ?>
                                  


                                  Ca récupère le chemin et le renvoi à dossierCourant.php via le div 'pageCourante'...
                                  C'est pas encore jolie jolie, mais je vous tiendrai au courant de l'avancé ;)

                                  Si vous avez des idées sur le problème de ma requête sql et de mon clic droit sur l'iframe...

                                  Bonne soirée et merci beaucoup à Abraksas qui m'a permis de mettre fin à quelques jours de désespoir ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 mars 2010 à 16:36:20

                                    Salut à tous!

                                    Voila, je bataille toujours autant avec l'affichage du dossier courant...

                                    Le chemin est récupéré avec succès (j'ai fait un input type=text pour vérifier que le chemin était bien transmit). Ce formulaire (qui était juste pour tester au début) servira de barre d'adresse...

                                    L'affichage de la base (./BDD) fonctionne dès que l'on se connecte, mais sur le onclick de l'arborescence, malgré la récupération du chemin, l'affichage ne fonctionne pas o_O
                                    La fonction 'espaceOccupe()' ligne 58 dans dossierCourant.php affiche le contenue (nombre de sous répertoire, de fichier et taille totale), mais pas d'arborescence!

                                    J'ai remarqué qu'il y avait un problème de slash, d'où l'utilisation de:
                                    $dir= str_replace("//", "/", $chemin); ligne 46
                                    Les doubles slashs sont remplacés par un seul...

                                    J'ai mis à jour le .zip dans mon premier post!
                                    Je sais plus où donner de la tête :euh:
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 avril 2010 à 11:41:21

                                      Me revoilà avec mon dossier courant affiché (nouvelle page contenuMosaique.php et les fonctions qui vont avec...). La transmission entre l'arborescence et le dossier courant fonctionne très bien.

                                      Merci à Abrakas qui m'a permis de résoudre cette première difficulté ^^

                                      Le problème maintenant c'est de naviguer dans celui-ci :-°
                                      J'utilise la même fonction ajax pour 'poster' le chemin du répertoire cliqué, mais il semble y avoir un problème avec cette ligne:
                                      document.getElementById('pageActive').innerHTML = xhr.responseText;
                                      


                                      Voici le code complet de ma fonction (avec des alerts un peu partout pour tester d'où venait le soucis)
                                      function envoiChemin(chemin)
                                      {
                                      	// Nous créons un objet XMLHttpRequest
                                      	get_Xhr();
                                      
                                      	var method		= "POST";
                                      	var filename	= "contenuMosaique.php";
                                      	var data		= null;
                                      	data 			= "chemin="+chemin;
                                      	
                                      	// On ouvre la page "mosaiqueContenu.php" en mode asynchrone (true)
                                      	xhr.open(method, filename, true);
                                      
                                      	xhr.onreadystatechange = function()
                                      	{
                                      		//Si la requete est terminée et qu'elle ne remonte pas d'erreur
                                      		if(xhr.readyState == 4 )
                                      		{
                                      		//alert (xhr.status);
                                      			if (xhr.status == 200)
                                      			{	alert ("status:  200");	}
                                      			else if (xhr.status == 0)
                                      			{	alert ("status: 0");	}
                                      		// Ici on place l'action à effectuer
                                      			alert (xhr.responseText);
                                      			document.getElementById('pageActive').innerHTML = xhr.responseText;
                                      			alert ("reponseText ok");	// !!! Ne s'affiche pas... !!!
                                      		}
                                      	}
                                      
                                      	// Obligatoire si l'on passe en POST
                                      	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                      	//Envoie de la requete
                                      	xhr.send(data);
                                      	
                                      	alert("envoyé");
                                      }
                                      


                                      A la ligne 25, l'affichage de "responseText" fonctionne, mais après la sélection de mon iframe 'paeActive' et de l'actualisation du contenu (innertHTML), l'alert ne s'affiche pas, mais le programme continu de tourner (puisque les autres alert s'affichent).

                                      Je ne vois pas en quoi la ligne 26 pose problème puisqu'elle est identique à ma fonction dans mon arborescence (copie conforme avec changement de l'adresse de destination (ligne 7 'filename').
                                      Le fait de renvoyer des infos sur la même page (voire même iframe) pose-t'il problème?

                                      Si vous avez des idées, je suis preneur ;)

                                      Merci d'avance!

                                      EDIT:
                                      le zip est disponible ici
                                      La base de données dans le répertoire IoExplorer/BDD/IoExplorer.sql

                                      EDIT 2:
                                      J'ai modifié la ligne 26 en ajoutant 'window.parent.'
                                      window.parent.document.getElementById('pageActive').innerHTML = xhr.responseText;
                                      


                                      L'iframe récupère le chemin en post, il affiche toutes les 'alerts', et le répertoire cliqué. Maintenant ca marche...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 avril 2010 à 11:59:54

                                        Salut à tous.

                                        Plutôt que de ré-ouvrir un sujet, je poste ici...
                                        Même si le sujet de départ dérive un peu, on reste dans le cadre de l'explorateur :-°

                                        Voila, j'ai une arborescence qui fonctionne, un dossier courant qui permet la navigation, et maintenant j'aimerai pouvoir télécharger le fichier cliqué dans le dossiers courant.

                                        Ainsi j'ai récupéré un code pour 'forcer' le téléchargement que j'ai adapté à mes besoins:
                                        if(isset($_POST['fichier']))
                                        {	echo "reception ok<br/>";
                                        	$cheminComplet = $_POST['fichier'];
                                        	$chemin = str_replace ( "//", "/", $cheminComplet);
                                        	
                                        	$pos = strripos($cheminComplet, '/');	// repère la position du dernier slash '/' dans le chemin
                                        	//$chemin = substr($cheminComplet, 0, $pos+1);	// découpe le chemin pour recuperer seulement le chemin sans le fichier
                                        	$Fichier_a_telecharger = substr($cheminComplet, $pos+1, strlen($cheminComplet));	// découpe le chemin pour recuperer nom du fichier
                                        	
                                        	echo $chemin;
                                        	echo "<br/>";
                                        	echo $Fichier_a_telecharger;
                                        	echo "<br/>";
                                        }
                                        
                                        if (isset ($Fichier_a_telecharger))
                                        {
                                        	header("Content-disposition: attachment; filename=$Fichier_a_telecharger");
                                        	header("Content-Type: application/force-download");
                                        	header("Content-Transfer-Encoding: binary");
                                        	header("Content-Length: ".filesize($chemin));
                                        	header("Pragma: no-cache");
                                        	header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
                                        	header("Expires: 0");
                                        	readfile($chemin); 
                                        }
                                        


                                        Dans mon dossier courant, je crée un lien (onclick) qui appelle la fonction ajax pour envoyer en POST le fichier cliqué:
                                        function envoiFichier(fichier)
                                        {
                                        	alert ("fct");
                                        	// Nous créons un objet XMLHttpRequest
                                        	get_Xhr();
                                        	alert ("get ok");
                                        
                                        	var method		= "POST";
                                        	var filename	= "telechargerFichier.php";
                                        	var data		= null;
                                        	data 			= "fichier="+fichier;
                                        	
                                        	// On ouvre la page "telechargerFichier.php" en mode asynchrone (true)
                                        	xhr.open(method, filename, true);
                                        
                                        	xhr.onreadystatechange = function()
                                        	{
                                        		//Si la requete est terminée et qu'elle ne remonte pas d'erreur
                                        		if(xhr.readyState == 4)
                                        		{	//&& xhr.status == 200
                                        			//alert (xhr.status);
                                        			window.parent.document.getElementById('espaceFichier').innerHTML = xhr.responseText;	
                                        		}
                                        	}
                                        
                                        	// Obligatoire si l'on passe en POST
                                        	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                        	//Envoie de la requete
                                        	xhr.send(data);
                                        	
                                        	alert ("envoi ok");
                                        }
                                        


                                        J'actualise ma page (index.php) et quand je clique sur un fichier dans la racine de mon dossier courant, le fichier en question (html) s'affiche dans mon div 'espaceFichier'.

                                        1. je ne comprend pas pourquoi ca affiche le contenu plutôt que d'ouvrir la fenêtre de téléchargement (avec ouvrir ou télécharger)
                                        2. quand je navigue dans mes sous-répertoire, le clic sur un fichier ne produit rien (pas d'envoi en POST du chemin du fichier o_O )

                                        J'ai fait quelques 'alert' mais rien ne s'affiche si on est pas dans la racine :euh:

                                        Si quelqu'un a une idée :D

                                        Bon ap'
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 avril 2010 à 14:06:11

                                          Bonjour
                                          Pour chaque fichier tu peux essayer de faire un lien vers une page php ou l'adresse du fichier a telecharger est transmise par la méthode get.
                                          Et dans la page php créee tu écris ca dans l'entete:
                                          <META http-equiv='Refresh' content='temps; URL=url'>

                                          temps est à remplacer par le nombre de secondes à attendre et url par l'url du fichier à télécharger

                                          J'ai pas essayé mais ca devrait marcher
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 avril 2010 à 14:24:52

                                            Le problème avec GET, c'est qu'il est facile de télécharger n'importe quel fichier (en connaissant son chemin...)
                                            Or, le navigateur interdit l'accès à certains dossier et donc à des fichiers.

                                            Cette méthode n'est donc pas adaptée.

                                            Depuis mon dernier message, j'ai réussi à récupérer le chemin de tous les fichiers cliqués (même dans les sous-répertoires)...

                                            Le problème, c'est qu'au lieu d'ouvrir la fenêtre de choix (enregistrer ou ouvrir), le fichier s'affiche dans mon div :o
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 avril 2010 à 14:46:43

                                              Si la vérification des droits pour télécharger le fichier n'est pas trop long ma méthode peut toujours marcher. En même temps je connais pas d'autre moyen a part faire un lien direct vers le fichier du style <a href="tonfichier.doc">Ton fichier</a>. Mais la c'est le meme probleme les droits peuvent ne pas etre respectés

                                              Sinon une méthode moins jolie:
                                              Tu affiches l'ensemble de tes fichiers dans un formulaire où au bout de chaque fichier il y a une case a cocher et un bouton submit qui te permet d'envoyer l'adresse en POST a la page php qui va le telecharger.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 avril 2010 à 14:51:52

                                                o_O
                                                Visiblement je me suis mal fait comprendre...

                                                J'ai mon iframe au centre de ma page qui permet de naviguer dans les répertoires.
                                                Lorsqu'on clique sur un fichier, son chemin est envoyé vers l'id 'espaceTelechargement' (à droite).
                                                La méthode POST fonctionne, et le chemin est bien réceptionné (j'ai testé en affichant chemin et nom du fichier).
                                                En image

                                                Le problème, c'est le téléchargement du fichier (l'affichage de la fenêtre enregistrer sous... / Ouvrir).
                                                J'ai essayé plusieurs codes sources pour 'forcer le téléchargement', mais jusque là, rien n'y fait :(
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  9 avril 2010 à 15:09:15

                                                  Ben de toute manière pour télécharger quelque chose il faut que tu fasse un lien ou que tu rediriges vers l'adresse du fichier donc soit tu le mets dans la barre d'adresse et il est donc visible par tout le monde donc tu es obligé de controler les droits soit tu stocke le chemin lorsque tu le récupère dans une variable session puis tu appelles une page telechargement dans laquelle tu mets
                                                  <META http-equiv='Refresh' content='temps; URL=<?php echo $_SESSION["url"];?>'>
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 avril 2010 à 17:33:11

                                                    Je pensais plus simplement...

                                                    J'ai mon iframe dans laquelle je clique sur mon fichier.
                                                    Ajax renvoi son chemin vers telechargerFichier.php qui récupère la variable (chemin) et découpe son nom (avec la fonction basename() ).

                                                    On affiche ainsi le chemin et le nom du fichier, ainsi qu'un lien pour le télécharger.
                                                    Mais au lieu d'avoir la fenêtre, j'ai le fichier en question qui s'affiche :euh:
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 avril 2010 à 11:45:23

                                                      Salut!

                                                      J'ai continué l'affichage des informations fichiers (Emplacement, nom, taille, date de modif), mais suis toujours bloqué sur le téléchargement...

                                                      Voici ma fonction de téléchargement (récupérée sur le manuel php)
                                                      <?php
                                                      function phpDownload($file)
                                                      {
                                                      	if (file_exists($file)) 
                                                      	{	
                                                      		header('Content-Description: File Transfer');
                                                      		header('Content-Type: application/octet-stream');
                                                      		header('Content-Disposition: attachment; filename='.basename($file));
                                                      		header('Content-Transfer-Encoding: binary');
                                                      		header('Expires: 0');
                                                      		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                                                      		header('Pragma: public');
                                                      		header('Content-Length: ' . filesize($file));
                                                      		ob_clean();
                                                      		flush();
                                                      		readfile($file);
                                                      		exit;
                                                      	}
                                                      }
                                                      ?>
                                                      


                                                      Et voici l'appel des différentes fonctions pour l'affichage et pour 'forcer' le téléchargement
                                                      <?php
                                                      
                                                      if(isset($_POST['fichier']))
                                                      {
                                                      	$cheminComplet= $_POST['fichier'];	// récupèration du chemin
                                                      	$chemin= str_replace ( "//", "/", $cheminComplet); // supréssion des doubles slash
                                                      	
                                                      	$adresse=adresseFichier($chemin);		// recupère l'adresse sans le nom
                                                      	$nom= basename($chemin);				// récupère le nom
                                                      	$taille=filesize($chemin);				// taille du fichier
                                                      	$tailleFinale= tailleMesure($taille);	// taille mise en forme et mesure (o, Ko, Mo)
                                                      	$dateModif= dateModification($chemin);	// date de dernière modification
                                                      	
                                                      	echo "Adresse:<br/>".$adresse.'<br/>';
                                                      	echo "Nom:<br/>".$nom.'<br/>';
                                                      	echo "Taille:<br/>".$tailleFinale.'<br/>';
                                                      	echo "Date de derniere modification:<br/>".$dateModif.'<br/>';
                                                      
                                                      	echo '<a href="" onclick="phpDownload($chemin);">Telecharger</a>';
                                                      	//phpDownload($chemin);
                                                      }
                                                      ?>
                                                      


                                                      Sur le clic du lien 'Telecharger', la page d'accueil est renvoyée !!?? o_O
                                                      Impression écran
                                                      Lors de l'appel de la fonction phpDownload() (que j'ai laissé en commentaire), le fichier cliqué s'affiche dans ma page, mais aucune fenêtre ne s'affiche :(

                                                      Votre aide est la bienvenue!
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 avril 2010 à 16:03:47

                                                        Suis-je bête ? ^^
                                                        Je mélange du JavaScript (onclick) et du php (fonction phpDownload($chemin)) comme un débutant :honte:

                                                        J'ai donc cherché sur le net pour trouver quelque chose de cohérent avec ce que je veux faire, mais j'ai été surprit de voir que toutes les sources envoient le lien en méthode GET (par l'url)...

                                                        Afin de sécuriser l'accès aux données, je dois faire en sorte que le fichier cliqué (et dont les informations sont affichés dans le bas de la page) soit téléchargeable via un lien <a href...>
                                                        J'ai donc mis en place la page infoFichier.php (clone de mon ancien telechargerFichier.php) qui affiche le chemin, le nom, la taille et la date de dernière modification.

                                                        Ma question est simple...
                                                        Y a t'il un moyen de télécharger un fichier de manière sécurisé (sans base de données, sans passer par GET) ? Comment?


                                                        Merci d'avance pour votre soutien :)
                                                        ___________________________________________________________________________________
                                                        ___________________________________________________________________________________
                                                        EDIT:
                                                        Voici mon code qui me permet d'interdire le téléchargement des fichiers sensibles à la sécurité du site:
                                                        <?php
                                                        
                                                        $fichier=$_GET['file'];	// récupère le chemin du fichier
                                                        
                                                        $extensionFichier = strtolower(substr(strrchr($fichier, ".") ,1));	// on découpe le nom du fichier pour récupèrer l'extension
                                                        
                                                        // interdit le téléchargement des certains fichiers (.php, .inc, html etc...) par mesure de sécurité
                                                        	if (in_array($extensionFichier, array('sql', 'php', 'php3', 'php4', 'php5', 'inc', 'html', 'htm', 'xml', 'js')))
                                                        	{
                                                        		die ("<div style=\"text-align: center;\">Le téléchargement de l'extension <big>.$extensionFichier</big> n'est pas autorisé.<br/>
                                                        		<a href='./index.php'>Retour</a></div>");
                                                        	}
                                                        
                                                        	if (file_exists($fichier)) 
                                                        	{	// téléchargement du fichier
                                                        		header('Content-Description: File Transfer');
                                                        		header('Content-Type: application/octet-stream');
                                                        		header('Content-Disposition: attachment; filename='.basename($fichier));
                                                        		header('Content-Transfer-Encoding: binary');
                                                        		header('Expires: 0');
                                                        		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                                                        		header('Pragma: public');
                                                        		header('Content-Length: ' . filesize($fichier));
                                                        		ob_clean();
                                                        		flush();
                                                        		readfile($fichier);
                                                        		exit;
                                                        	}
                                                        	else {	echo "Le fichier est introuvable, veuillez <a href='./index.php'>réessayer</a>.";	}
                                                        		
                                                        ?>
                                                        


                                                        Le code fonctionne, on peut ouvrir ou téléchargé le fichier au choix...
                                                        Malgré que l'on puisse chercher les fichiers d'autres utilisateurs du module (pas encore crée de condition), j'aimerai savoir si c'est fiable et s'il n'y a pas moyen de biaiser ce petit bout de code pour un 'hacker' confirmé ? :pirate:
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Explorateur de fichier

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown