Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable pas prise en compte

Sujet résolu
    16 février 2012 à 8:26:41

    Bonjour

    Voilà j'ai une variable String, que j'instancie et que j'utilise pour ouvrir un flux
    Seulement elle ne fonctionne pas, je m'explique:
    Lorsque je fais un print de cette variable j'ai un chemin vers un fichier
    Et quand je mets cette variable dans un FileInputStream, ça ne met pas le meme contenue que mon print 0_o
    j'ai beau avoir tous essayé, cherché sur google, rien ... :(

    voici l'erreur:

    java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\Connexion\fichiers\admin\rapport.txt (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)
    java.io.FileInputStream.open(Native Method)
    java.io.FileInputStream.<init>(Unknown Source)
    java.io.FileInputStream.<init>(Unknown Source)
    com.log.servlet.dlServlet.doGet(dlServlet.java:18)
    com.log.servlet.dlServlet.doPost(dlServlet.java:31)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

    et voici le print de cette variable:
    chemin vaut: C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/Connexion/fichiers/admin/rapport.txt

    voici mon code:
    package com.log.servlet;
    
    import java.io.*;
    import java.net.URL;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class dlServlet extends HttpServlet{
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)						
    	throws IOException, ServletException{
    		String chemin = (String)request.getParameter("chemin");
    		String filename = (String)request.getParameter("filename");
    		System.out.println("chemin vaut: "+chemin);
    		InputStream is= new FileInputStream(chemin);
    		OutputStream os = response.getOutputStream();
    		response.setHeader("Content-Disposition","attachment;filename="+filename+"");
    		int count;
    		byte buf[] = new byte[4096];
    		while ((count = is.read(buf)) > -1)
    		os.write(buf, 0, count);
    		is.close();
    		os.close();
    	}
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)						
    	throws IOException, ServletException{
    		doGet(request, response);
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      16 février 2012 à 8:52:09

      C'est probablement à cause de l'espace dans ton chemin d'accès au fichier. Entour le simplement de guillemet, ça devrait suffire
      • Partager sur Facebook
      • Partager sur Twitter
      http://tuclictugeek.fr - Avis et Test sur Jeux-vidéo et Mangas
        16 février 2012 à 8:54:47

        genre faire ceci ? InputStream is= new FileInputStream(""+chemin+"");
        ça n'a aucun sens

        J'ai essayé d'encoder ma chaine mais ça ne fonctionne pas non plus
        • Partager sur Facebook
        • Partager sur Twitter
          16 février 2012 à 10:27:35

          Je pensais plutôt à " " "+chemin+" " "

          Le fichier existe bien?
          • Partager sur Facebook
          • Partager sur Twitter
          http://tuclictugeek.fr - Avis et Test sur Jeux-vidéo et Mangas
            16 février 2012 à 10:29:41

            oui, il existe bien ^^

            j'ai une erreur en mettant ça:
            InputStream is= new FileInputStream(" " "+chemin+" " ");
            


            [EDIT] j'ai "bidouller" ^^ et c'est comme si ma chaine était automatiquement transformé 0_o
            voici ce que j'ai fait:
            String as = new String ("%2F");
            		String das = new String("/");
            		String realurl = cheminencode.replace(as, das);
            		String as1 = new String ("%3A");
            		String das1 = new String(":");
            		String realurl1 = realurl.replace(as1, das1);
            		System.out.println("realurl vaut: "+realurl);
            		System.out.println("realurl1 vaut: "+realurl1);
            		System.out.println("chemin vaut: "+chemin);
            		System.out.println("cheminencode vaut: "+cheminencode);
            		InputStream is= new FileInputStream(realurl1);
            


            et tomcat me dis:
            java.io.FileNotFoundException: +C:\Program+Files\Apache+Software+Foundation\Tomcat+7.0\webapps\Connexion\fichiers\admin\rapport.txt+ (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)
            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2012 à 10:36:33

              Citation : iradorn

              j'ai une erreur en mettant ça:

              InputStream is= new FileInputStream(" " "+chemin+" " ");
              

              Si tu ne vois pas l'erreur dans ce bout de code, c'est qu'il est urgent de reprendre un tuto sur Java et la gestion des chaînes de caractères.

              PS : Installe ton Eclipse et ton Tomcat dans un répertoire hors de Program Files et sans espaces dans le chemin complet, ça évite beaucoup de problèmes.
              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2012 à 10:40:03

                nan tkt spacefox je vois l'erreur hein
                là dans l'état, la variable n'est pas en dehors de la chaine donc pas pris comme variable
                mais je lui disais que que ça ne fonctionnait pas
                Wé je sais, de toute facon l'appli sera déployé sur un serveur après donc le chemin ne sera pas le meme, mais quand même
                regarde mon edit

                Meme lorsque je mets un chemin beaucoup plus petit sans espace, ça ne fonctionne pas
                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2012 à 11:39:28

                  1/ Si tu veux mettre une apostrophe dans une chaîne il faut l'échapper :
                  String uneApostrophe = "\"";
                  String deuxApostrophes = "\"\"";
                  String unCheminAvecDesApostrophes = "\"C:/Program Files/\"";
                  


                  Mais de toute façon ton soucis n'est pas là. Si tu galères autant c'est que tu cherches à faire des choses complexes en n'ayant pas les bases requises. Du coup tu fouilles au mauvais endroit à chaque topic que tu publies.

                  Ton problème c'est que le chemin vers le fichier (/ ou \ peu importe) est mal indiqué. Etant donné que dans un autre topic tu confondais client et serveur, que t'as collé ton fichier dans un répertoire avec un nom infernal, ... Et qu'on n'a pas accès à ton poste, c'est difficile de t'aider.

                  Apprends à débugger et à te débrouiller avant de poser des questions.
                  Typiquement, essaye de mettre ton fichier à la racine, sans espace, sans accent, sans rien : C:\rapport.txt . Teste, regarde, utilise les méthode de l'objet File (exists() à tout hasard), fais un test simple (unitaire), hors servlet, hors contexte web, dans un bête programme console. Vas-y par étape. Tu ne t'en sortiras jamais avec de telles méthodes (dès que j'ai un soucis j'ouvre un nouveau topic, je ne comprends strictement rien à ce que je fais, j'en veux pour preuve ton EDIT : c'est tout simplement n'importe quoi).

                  On NE PEUT PAS tout faire à ta place. Surtout sans avoir accès à ton poste.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2012 à 11:44:59

                    Je ne veux pas mettre apostrophe dans mon chemin !
                    J'ai essayé avec un chemin beaucoup plus court, du genre: chemin vaut: C:\fichiers\admin\rapport.txt
                    mais ça ne fonctionne pas

                    Et avant de poster ce messsage j'ai longtemps cherché, j'ai meme demandé au développeur de l'entreprise, il ne sait pas pourquoi il y a ce changement
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 février 2012 à 11:50:44

                      s/apostrophe/guillemets
                      Désolé.

                      Écoute si tu es de bonne fois et que même un développeur confirmé qui a accès à ton poste et peut tester en direct n'a pas trouvé d'erreur, que veux-tu qu'on fasse...

                      Pour "pourquoi il y a ce changement" bah c'est simplement le code que t'as mis en Édit qui le provoque, je vois pas quoi te dire de plus.

                      Bon courage.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 février 2012 à 11:58:55

                        mwé ...
                        bon je crois que ce topic est voué à l'échec
                        ce que je veux dire en gros c'est que lorsque je fais sa:
                        new FileInputStream(mavariable); ça ne fonctionne pas
                        et lorsque je fais new FileInputStream("contenuvariable"); ça fonctionne

                        le EDIT plus haut je l'ai supprimé c'était pour chercher une solution
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 février 2012 à 12:31:59

                          Ah, bah ça c'est plus clair par contre.

                          Donc le chemin en dur dans la chaîne fonctionne on est d'accord ?

                          Déja tu vas faire afficher : taVariable.equals("la chaîne en dur") et tu devrais te rendre compte qu'il va renvoyer faux, donc que les chaînes ne sont pas identiques, ensuite tu vas nous dire d'où provient ta variable (d'un paramètre passé dans l'URL non ? Attention gros problème de securité !!).

                          Si c'est le cas, regarde d'abord du côté de la classe URLDecoder , après on t'expliquer à pourquoi tu dois changer de méthode (grosse faille de sécurité).


                          Si c'est pas le cas, explique nous précisément d'où provient ta variable
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 février 2012 à 13:40:45

                            ok j'étais partis manger
                            je test sa Javier

                            et oui le chemin en dur fonctionne

                            [EDIT]
                            donc j'ai fais ce que tu m'as demandé:
                            if(realurl.equals("C:/fichiers/admin/rapport.txt")){
                            System.out.println("ok");
                            }
                            else{System.out.println("faux");}
                            


                            Et la console m'affiche Faux, c'est quand meme bizarre
                            je vais donc aller voir URLDecoder
                            mais pour je n'utilise pas d'encoder donc pourquoi un decoder ? ^^
                            Je sais que faire passer le chemin du fichier en clair dans l'url n'est pas top mais bon, je verrai ça après ppar le biais du .htaccess je crois que l'on peut modifier l'url
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 février 2012 à 14:07:36

                              C'est même pas bon du tout du tout. Tu exposés tout ton serveur en fait y compris les fichiers de config de Tomcat etc. C'est un trou béant !

                              Pour répondre à ta question, regarde la doc de la classe URLDecoder, et regarde d'où provient la chaîne que tu lis.

                              N'as-tu jamais vu de caractères bizarres dans les URL ? Tape encodage URL dans Google tu comprendras mieux.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 février 2012 à 14:13:37

                                ok, et toi ou vous, vous me conseillerez quoi pour changer ça
                                j'avais commencé à me renseigner pour encoder les variables de mon url
                                à la façon Megaupload

                                Sinon pour en revenir au problème,
                                vu que j'avais cherché une solutions a mon problème j'étais tombé aussi sur un sujet qui traitait de l'encodage pour les espaces par exemple
                                mais le problème persistait
                                j'avais tenté ceci par exemple:
                                String cheminencode = URLEncoder.encode(chemin,"UTF-8");
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 février 2012 à 14:20:48

                                  A trop vouloir en faire, on n'arrive plus à rien. Donc on va y aller étape par étape.

                                  Fais toi une petite servlet toute simple, qui reçoit le nom du fichier dans l'URL (on verra le reste après).

                                  Dans la méthode doGet de ta servlet, affiche le paramètre qui est dans l'URL, puis affiche le chemin en dur (dans la console par exemple). L'un ou dessous de l'autre.

                                  Puis en dessous, affiche taVariable.equals("cheminEnDur");

                                  Tu nous donnes le code de cette petite servlet et le résultat qui s'affiche de la console.

                                  Ensuite, fais la même chose en remplaçant paramètre par URLDecoder.decode(parametre, "UTF-8"); et tu nous donnes ton code et le résultat de la console.

                                  On y verra déjà plus clair, là j'ai l'impression de faire du support technique par chat c'est exaspérant. Structure les infos que tu nous donnes, et JE LE RÉPÈTE fais des petits tests avant de tout tester en bloc.



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 février 2012 à 14:32:04

                                    Merci à toi Javier déjà pour ton aide, là le sens Zéro prend tout son sens:

                                    alors:

                                    1/ voici la variable "chemin" que je reçois de l'url: chemin vaut: C:\fichiers\admin\rapport.txt
                                    Grace à ceci:
                                    String chemin = (String)request.getParameter("chemin");
                                    


                                    2/ Pour savoir si chemin=cheminendur je suis obligé de convertir les "\" "\\" sinon évidemment ça ne marche pas:
                                    donc:
                                    String as = new String ("\\");
                                    String das = new String("/");
                                    String chemin2 = chemin.replace(as, das);
                                    
                                    if(chemin2.equals("C:\\fichiers\\admin\\rapport.txt")){
                                    	System.out.println("ok");
                                    }
                                    else{System.out.println("faux");}
                                    


                                    La console me renvoit:
                                    chemin2 vaut: C:\\fichiers\\admin\\rapport.txt et Faux

                                    3/
                                    Et donc avec l'encodage:


                                    String cheminencode = URLEncoder.encode(chemin2,"UTF-8");
                                    


                                    cheminencode vaut: +C%3A%5C%5Cfichiers%5C%5Cadmin%5C%5Crapport.txt+
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 février 2012 à 14:37:55

                                      Citation : iradorn


                                      String as = new String ("\\");
                                      String das = new String("/");
                                      String chemin2 = chemin.replace(as, das);
                                      

                                      Je veux bien savoir pourquoi tu nous a pondu cette chose. Si tu n'es pas capable de l'expliquer, tu devrais revenir aux bases du langage et arrêter J2EE pour l'instant.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 février 2012 à 15:52:54

                                        Citation : SpaceFox

                                        Citation : iradorn


                                        String as = new String ("\\");
                                        String das = new String("/");
                                        String chemin2 = chemin.replace(as, das);
                                        


                                        Je veux bien savoir pourquoi tu nous a pondu cette chose. Si tu n'es pas capable de l'expliquer, tu devrais revenir aux bases du langage et arrêter J2EE pour l'instant.



                                        je suis parfaitement capable de l'expliquer -_-
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 février 2012 à 16:18:00

                                          eh bien Mr le professeur ...

                                          en faisant les new string j'alloue de la mémoire, crée l'objet puis le référence
                                          ensuite replace permet de remplacer dans la chaine spécifier, une chaine par une autre

                                          après je peux me tromper, mais mes profs m'ont dit ça !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 février 2012 à 16:23:18

                                            Oui, c'est bien ce qu'il me semblais. Il faut vite que tu retournes lire les bases de Java, entre autres la gestion des String.
                                            Parce que normalement, une des premières choses que tu apprends quand tu gères les String, c'est que :
                                            String as = new String ("\\");
                                            String das = new String("/");
                                            

                                            sauf cas spéciaux n'a aucun intérêt par rapport à :
                                            String as = "\\";
                                            String das = "/";
                                            


                                            Au final tes trois lignes se résument aussi bien en :
                                            String chemin2 = chemin.replace("\\", "/");
                                            

                                            Ce qui est plus simple, plus lisible, et ne déclare pas de variables intermédiaires inutiles aux noms douteux.

                                            Donc, je persiste et signe : si tu en es encore à faire ce genre d'"erreurs", tu ferais vraiment mieux de reprendre les bases de manière à les maîtriser vraiment avant de t'attaquer à du délicat.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              16 février 2012 à 16:29:10

                                              Au passage, si ça peut aider à exclaicir le mystère des chaînes pas égales mais identiques (OMGWTFBBQ >_< ), le code suivant affichera true puis false :

                                              System.out.println("foo" == "foo");
                                              System.out.println(new String("bar") == new String("bar"));
                                              
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                16 février 2012 à 16:31:11

                                                désolé alors, pourquoi mon prof m'a dit ça alors ? -_-

                                                mais le problème ne viendrai pas de là ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  16 février 2012 à 16:37:29

                                                  Parce que String est vraiment l’exception qui confirme la règle en Java ! :D

                                                  Et oui, éventuellement.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    16 février 2012 à 16:44:42

                                                    Citation : Coyote

                                                    Au passage, si ça peut aider à exclaicir le mystère des chaînes pas égales mais identiques (OMGWTFBBQ >_< ), le code suivant affichera true puis false :

                                                    System.out.println("foo" == "foo");
                                                    System.out.println(new String("bar") == new String("bar"));
                                                    

                                                    A noter que Java ne te garantis absolument pas que la première notation te donnera "true". Ca marche uniquement parce qu'il y a un système de cache de String implémenté dans la plupart des JVM.

                                                    Pour le prof, il y a énormément de mauvais profs de Java. Typiquement des gens qui viennent du C ou du C++ et qui font du Java de la même manière, ou qui enseignent le Java d'il y a 10 ans.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      16 février 2012 à 16:47:14

                                                      Exactement ça Spacefox, il est près de la retraite :lol:

                                                      bon après modification (enlever les news string)
                                                      ça ne fonctionne toujours pas
                                                      mais Javier penchait plutot du coté de l'encodage
                                                      et du coup meme en faisant ceci:
                                                      String chemin2 = chemin.replace("\\", "/");
                                                      String cheminencode = URLEncoder.encode(chemin2,"UTF-8");
                                                      System.out.println("chemin2 vaut: "+chemin2);
                                                      if(chemin2.equals("C:/fichiers/admin/rapport.txt")){
                                                      System.out.println("ok");
                                                      }
                                                      else{System.out.println("faux");}
                                                      


                                                      j'ai toujours d'afficher: faux 0_o
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        16 février 2012 à 17:20:51

                                                        Ptain, mais lis ce que j'écris sans déconner...
                                                        C'est désespérant de t'aider.


                                                        D'une part t'utilises UrlEncoder et pas Decoder comme je te l'ai demandé. Donc t'as rien pigé à l'encodage des URL. Par contre ça m'aura au moins permis de voir un truc, c'est que t'as des espaces en début et en fin de chaîne.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 février 2012 à 11:10:05

                                                          oui mais le truc que je demande, c'est pour l'a décoder alors que normalement ( a part là puisque je test tout ) je ne l'encode pas
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 février 2012 à 11:53:13

                                                            Ça fait 3 ou 4 topics que j'essaie de t'aider sans y arriver, je laisse tomber et passe la main à des gens plus patients.

                                                            Désolé.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Variable pas prise en compte

                                                            × 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