IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Téléchargement d'un fichier distant


Sujet :

Langage Java

  1. #1
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut Téléchargement d'un fichier distant
    Bonjour à tous,

    J'ai écris une classe JAVA afin de me permettre de télécharger un fichier distant. Cela fonctionne sous Windows 7, Vista et Ubuntu mais pas sur Windows XP et je ne sais pas pourquoi. Normalement en JAVA cela ne doit pas poser problème.

    Voilà ma classe Download :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    package update;
     
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
     
    public class Download
    {
        public static void getFile(String host)
        {
            InputStream input = null;
            FileOutputStream writeFile = null;
     
            try
            {
                URL url = new URL(host);
                URLConnection connection = url.openConnection();
                int fileLength = connection.getContentLength();
     
                if (fileLength == -1)
                {
                    System.out.println("Invalide URL or file.");
                    return;
                }
     
                input = connection.getInputStream();
                String fileName = url.getFile().substring(url.getFile().lastIndexOf('/') + 1);
                writeFile = new FileOutputStream(fileName);
                byte[] buffer = new byte[1024];
                int read;
     
                while ((read = input.read(buffer)) > 0)
                    writeFile.write(buffer, 0, read);
                writeFile.flush();
            }
            catch (IOException e)
            {
                System.out.println("Error while trying to download the file.");
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    writeFile.close();
                    input.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    Et je l'utilise comme ceci :
    Download.getFile("XXXXX/info.xml");

    Cela me télécharge le fichier distant dans le répertoire de l'ordinateur courant.

    Est-ce que vous comprenez pourquoi ? Sachant que sur XP, il n'y avait pas de pare feu, tous les ports ouvert, antivirus coupé.

    Je ne comprend pas...

    Bonne journée

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Normalement, ton code est indépendant de l'OS. Est-ce que ton OS sous XP embarque bien un serveur HTTP ? Et est-ce que le fichier recherché se trouve bien dans le bon répertoire ?

    Quel message d'erreur rencontre-tu ?

  3. #3
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Bonjour, merci pour ta réponse. Malheureusement je n'obtiens aucun message d'erreur en lançant mon programme depuis l'invite de commande XP. Il n'y a pas besoin de serveur HTTP. J'envois juste une socket sur le port 80 sur mon serveur web et je récupère le fichier.

    Tous est au bon endroit vu que cela fonctionne sur Vista, Ubuntu et Seven. Je suis bien d'accord avec toi pour dire que c'est indépendant de l'OS et c'est bien là que le bât blesse...

    J'avoue être bloqué et ne pas savoir quoi faire. Normalement, si il y a une exception, il y a un message d'erreur qui s'affiche dans la console. Et là sous XP rien... Et je suis bien en administrateur sur les machines.

    Si tu as un meilleur code pour uploader des fichiers distant je suis preneur mais normalement le mien fonctionne...

    D'avance merci

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Quelques petites remarques :
    • Je te déconseille de vérifier le fileLength, car le serveur ne l'envoi pas forcément (en particulier lorsque le fichier est généré).
    • Selon l'URL que tu utilises, le nom du fichier peut être vide. Il serait plus prudent de gérer le cas.
    • Il est préférable d'utiliser un try/finally par flux. Sinon rien ne garantie que tous les flux ouvert seront bien fermés...



    Ensuite il faudrait un exemple concret, avec l'URL exact si possible, le code du main(), ainsi que la manière dont tu le lances et le résultat de la console...


    a++

  5. #5
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Alors voilà mon code complet :

    Classe Download :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    package update;
     
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
     
    public class Download
    {
        public static void getFile(String host)
        {
            InputStream input = null;
            FileOutputStream writeFile = null;
     
            try
            {
                URL url = new URL(host);
                URLConnection connection = url.openConnection();
                int fileLength = connection.getContentLength();
     
                if (fileLength == -1)
                {
                    System.out.println("Invalide URL or file.");
                    return;
                }
     
                input = connection.getInputStream();
                String fileName = url.getFile().substring(url.getFile().lastIndexOf('/') + 1);
                writeFile = new FileOutputStream(fileName);
                byte[] buffer = new byte[1024];
                int read;
     
                while ((read = input.read(buffer)) > 0)
                    writeFile.write(buffer, 0, read);
                writeFile.flush();
            }
            catch (IOException e)
            {
                System.out.println("Error while trying to download the file.");
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    writeFile.close();
                    input.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    La classe main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    package main;
     
    import java.io.IOException;
     
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
     
    import update.*;
    import updategui.UpdateGui;
     
    public class Launcher {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		Update up = new Update();
     
    				JFrame frame = new JFrame();
    				UpdateGui inst = new UpdateGui(frame);
    				inst.setVisible(true);
     
    		up.updateVersion();
    		inst.dispose();
     
     
            try {
            	/*String path = System.getProperty("user.dir" );
            	System.out.println("LANCEMENT : "+path);*/
     
                Process process = Runtime.getRuntime().exec("java -jar dta.jar");
                process.getInputStream().close();
                process.getErrorStream().close();
            } catch (IOException ex) {
                System.out.println("LANCEMENT IMPOSSIBLE");
            }
     
    	}
     
    }
    Ma classe update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    package update;
     
    import java.io.File;
    import java.io.InputStream;
    import java.net.URL;
     
    import org.jdom.*;
    import org.jdom.input.SAXBuilder;
     
    public class Update {
    	static Document document;
    	static Document doconline;
    	static Element racine;
    	static Element version;
    	static Element racineon;
    	static Element versionon;
     
    	public Update() {
    		SAXBuilder sxb = new SAXBuilder();
    		try
    		{
    			String path = System.getProperty("user.dir" );
    			/*System.out.println(path);*/
    			document = sxb.build(new File(path+"/info.xml"));
    			URL adresse = new URL("XXXXXXinfo.xml");
    			InputStream stream = adresse.openStream();
    			doconline = sxb.build(stream);
    		}
    		catch(Exception e){
    			System.out.println("ERREUR CHARGEMENT DES FICHIERS");
    			System.exit(0);
    		}
     
    	}
     
    	/**
             * Retourne version local
             */
    	public String getVersion() {
    		racine = document.getRootElement();
    		version = racine.getChild("version");
    		return version.getText();
    	}
     
    	/**
             * 
             */
    	public String getVersionOnline() {
    		racineon = doconline.getRootElement();
    		versionon = racineon.getChild("version");
    		return versionon.getText();
    	}
     
    	/**
             * 
             */
    	public boolean compareVersion() {
    		if(this.getVersion().equals(this.getVersionOnline())) {
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
     
    	public void updateVersion() {
    		if(!this.compareVersion()) {
    			Download.getFile("XXXXX/dta.jar");
    			Download.getFile("XXXXXinfo.xml");
    		}
    	}
     
     
     
     
    }
    En plus que cela ne fonctionne pas sur XP, j'ai un autre problème... En effet, ma classe main vérifie et met à jour si besoin et lance le programme jar mis à jour. Mais quand on ferme l'interface graphique dta.jar, cela ne ferme jamais le processus associé à ma classe Launcher. Cela augmente donc le nombre de processus et fait planté d'autres programme sur mon système.

    D'avance merci

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    As-tu vérifier que le problème ne vennait pas des fichiers XML ?
    Affiches les valeurs retournée par getVersion() et getVersionOnline().


    Sinon tu ne fermes pas ton flux lors de la lecture XML sur l'URL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream stream = adresse.openStream();
    try {
         doconline = sxb.build(stream);
    } finally {
         stream.close();
    }
    (d'ailleurs tu n'as pas pris en compte mes précédentes remarques dans getFile())

    Et tu ne fermes pas non plus le flux d'entrée du Process :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    process.getOutputStream().close();
    Sinon pourquoi tout est en static dans la classe Update ????





    Citation Envoyé par akrogames Voir le message
    cela ne ferme jamais le processus associé à ma classe Launcher.
    System.exit(0) ?


    a++

  7. #7
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Ah merci ! Tout se ferme normalement maintenant ! J'ai rajouter un finally dans Launcher avec process.getOutputStream().close(); et sous XP le fichier se télécharge maintenant ! Et tout se lance correctement !

    Le programme principal ne se fermait pas ce qui perturbait peut être le download je sais pas.


    Merci à toi !

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/05/2014, 13h17
  2. Réponses: 2
    Dernier message: 28/09/2011, 12h26
  3. Réponses: 2
    Dernier message: 31/12/2009, 15h20
  4. Comparaison de fichiers distants, sans téléchargement
    Par 84mickael dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 04/04/2009, 11h12
  5. MapPath et fichier distant
    Par arno_ dans le forum ASP
    Réponses: 8
    Dernier message: 16/09/2003, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo