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

Entrée/Sortie Java Discussion :

Progress Bar avec org.apache.commons.net.ftp


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut Progress Bar avec org.apache.commons.net.ftp
    Bonjour,
    Mon projet en ce moment est de faire un programme qui envoie des fichiers sur un serveur ftp. Donc il fonctionne avec la librairie commons net d'apache, mais j'aimerai le faire un peu plus évoluer. C'est à dire faire une fonction pour voir la progression de l'envoi et pourquoi pas la vitesse également.
    J'envoie fichier par fichier, donc une connexion = 1 upload.



    J'ai pas mal fouiller sur le net, et je vois la fonction dans la doc de commons :

    public OutputStream storeUniqueFileStream(String remote) throws IOException

    Est ce que cette méthode peut me servir pour faire une progressbar ?
    Vu qu'il retourne, ce qui a été envoyé ?
    il faut faire une comparaison de taille sur le fichier en envois et et le flux envoyé ??


    Voilà mon code qui permet d'envoyer un fichier

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    package Moteur;
    import java.io.*;
    import java.net.SocketException;
     
    //import org.apache.commons.net.PrintCommandListener;
    import org.apache.commons.net.ftp.*;
     
    public class Ftp extends FTPClient
    {
     
    	public Ftp()
    	{
     
    	}
     
       	public boolean Upload(String server, String username, String password, String remote, String local) throws IOException
        {
     
    		boolean error = false;
     
     
            //this.addProtocolCommandListener(new PrintCommandListener( new PrintWriter(System.out))); //Active les écoutes des commandes FTP
     
            try
            {
     
                this.connect(server);
                //System.out.println("Connected to " + server + ".");
     
                int reply = this.getReplyCode();
     
                if (!FTPReply.isPositiveCompletion(reply))
                {
                    this.disconnect();
                    System.err.println("Connexion refusée.");             
                }
            }
            catch (IOException e)
            {
                if (this.isConnected())
                {
                    try
                    {
                        this.disconnect();
                    }
                    catch (IOException f)
                    {
                        // do nothing
                    }
                }
                System.err.println("Impossible de joindre le serveur.");
                //e.printStackTrace();
            }
     
            try
            {
     
     
                if (!this.login(username, password))
                {
                    this.logout();
                    error = true;
                    System.out.println("Login ou mot de passe non valide");
                }
     
                //System.out.println("Remote system is " + this.getSystemName());
     
                this.setFileType(FTP.BINARY_FILE_TYPE);
     
                this.enterLocalPassiveMode();
     
     
                InputStream input;
     
                input = new FileInputStream(local);
     
                this.storeFile(remote, input);
     
                input.close();
     
                this.logout();
            }
            catch (FTPConnectionClosedException e)
            {
                error = true;
                System.err.println("Server closed connection.");
                //e.printStackTrace();
            }
            catch (IOException e)
            {
                error = true;
                //e.printStackTrace();
            }
            finally
            {
                if (this.isConnected())
                {
                    try
                    {
                        this.disconnect();
                    }
                    catch (IOException f){}
                }
            }
     
         return error;
        }
     
       	public boolean TestConnexion(String server) throws SocketException, IOException			//Test si le serveur est joignable
       	{
       		boolean error = false;
     
            this.connect(server);
            int reply = this.getReplyCode();  
            if (FTPReply.isPositiveCompletion(reply))
                {
                    this.disconnect();
                    System.err.println("Connexion refusée.");             
                }
     
            return error;
       	}
     
     
    }
    Dites moi rapidement si je suis aux fraises et comment je peux arriver à faire ce que je veux.
    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Une possibilité : tu créés ton propre FileInputStream en surchargeant les méthodes de lecture. Tu y ajoutes un listener qui sera renseigné à chaque appel des méthode de lecture avec le nombre d'octets lu. Dans le listener, tu peux par exemple additionner les tailles et mettre à jour ta GUI toutes les secondes par exemple. Du coup, tu as la taille totale, la taille lue en un temps donnée, tu peux donc obtenir le taux de transfert et le pourcentage d'avancement.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Je doit être nœud-nœud car j'ai pas compris en fait. Au début je pensais avoir compris.
    J'ai testé plein de truc depuis hier mais j'arrive à rien.
    Ce que je voudrais c'est juste avoir en retour le nombre d'octet envoyé.
    je pensais qu'avec cette méthode : public OutputStream storeUniqueFileStream(String remote) throws IOException

    je pouvais avoir ça et puis à partir de là calculer vitesse etc...

    Bref j'ai pas compris grand chose aux streams..
    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
     
                 InputStream is = new FileInputStream(local);  
                 is = new ProgressMonitorInputStream(null, "Uploading", is);  
                 OutputStream os = this.storeFileStream(remote);  
                 byte[] buffer = new byte[1024];  
                 int len, len1=0;  
                 while ((len = is.read(buffer)) != -1)  
                 { 
                	if (len!=len1)System.out.println("len : " + len);
                	len1 = len;
                   os.write(buffer, 0, len);  
                   os.flush();  
               }  
               is.close();  
               os.close();

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le flush doit être fait en dehors de la boucle. Ceci permettra d'accroitre les performances si le flux est bufferisé.
    Ensuite, pour calculer la taille totale émise il suffit d'incrémenter une variable, et pour avoir la vitesse, il suffit d'ajouter la notion de temps.
    Avec le code suivant, tu calcules la vitesse moyenne depuis le début de traitement. Tu peux aussi t'amuser à calculer la vitesse instantanée.
    Exemple de code (non compilé) :
    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
     
      InputStream is = new FileInputStream(local);  
      OutputStream os = this.storeFileStream( remote );
      byte[] buffer = new byte[1024];  
      int total = 0;
      int taille_lue = 0;
      int temps_debut = System.currentTimeMillis();
      int temps_fin = temps_debut;
      int vitesse = 0;
     
      while( ( taille_lue = is.read( buffer ) ) > 0 )  
      {
        total += taille_lue;
        os.write( buffer, 0, taille_lue );  
        temps_fin = System.currentTimeMillis();
        vitesse = total / ( ( temps_fin - temps_debut ) / 1000 );
      }
     
      os.flush();
      is.close();
      os.close();

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    J'ai testé ça et j'ai des erreurs,

    Taille 1024
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at test.Ftp.Upload(Ftp.java:94)
    at test.Ftp$1.run(Ftp.java:158)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


    Si tu peux m'aider à décoder ce message d'erreur ça serait cool.


    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
    InputStream is = new FileInputStream(local);  
                OutputStream os = this.storeFileStream( remote );
                byte[] buffer = new byte[1024];  
                long total = 0;
                int taille_lue = 0;
                long temps_debut = System.currentTimeMillis();
                long temps_fin = temps_debut;
                long speed = 0;
     
                while( ( taille_lue = is.read( buffer ) ) > 0 )  
                {
                  System.out.println("Taille " + taille_lue);
                  total += taille_lue;
                  os.write( buffer, 0, taille_lue );
                  temps_fin = System.currentTimeMillis();
                  speed = total / ( ( temps_fin - temps_debut ) / 1000 );
                }
     
                os.flush();
                is.close();
                os.close();

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Donne le code complet ainsi que la ligne d'où provient l'erreur.
    Et regarde dans la documentation, il faut certainement vérifier la non nullité de l'output stream, car si la connection n'est pas possible, alors tu écris dans un flux qui n'existe pas.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Code

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    package test;
    import java.io.*;
    import java.net.SocketException;
    //import org.apache.commons.net.PrintCommandListener;
     
    import org.apache.commons.net.ftp.*;
     
    public class Ftp extends FTPClient
    {
     
    		public Ftp()
    	{
     
    	}
     
       	public boolean Upload(String server, String username, String password, String remote, String local) throws IOException
        {
     
    		boolean error = false;
     
     
            //this.addProtocolCommandListener(new PrintCommandListener( new PrintWriter(System.out))); //Active les écoutes des commandes FTP
     
            try
            {
     
                this.connect(server);
                //System.out.println("Connected to " + server + ".");
     
                int reply = this.getReplyCode();
     
                if (!FTPReply.isPositiveCompletion(reply))
                {
                    this.disconnect();
                    System.err.println("Connexion refusée.");             
                }
            }
            catch (IOException e)
            {
                if (this.isConnected())
                {
                    try
                    {
                        this.disconnect();
                    }
                    catch (IOException f)
                    {
                        // do nothing
                    }
                }
                System.err.println("Impossible de joindre le serveur.");
                //e.printStackTrace();
            }
     
            try
            {
     
     
                if (!this.login(username, password))
                {
                    this.logout();
                    error = true;
                    System.out.println("Login ou mot de passe non valide");
                }
     
                //System.out.println("Remote system is " + this.getSystemName());
     
                this.setFileType(FTP.BINARY_FILE_TYPE);
     
                this.enterLocalPassiveMode();
     
     
     
     
                InputStream is = new FileInputStream(local);  
                OutputStream os = this.storeFileStream( remote );
                byte[] buffer = new byte[1024];  
                long total = 0;
                int taille_lue = 0;
                long temps_debut = System.currentTimeMillis();
                long temps_fin = temps_debut;
                long speed = 0;
     
                while( ( taille_lue = is.read( buffer ) ) > 0 )  
                {
                  System.out.println("Taille " + taille_lue);
                  total += taille_lue;
                  os.write( buffer, 0, taille_lue );
                  temps_fin = System.currentTimeMillis();
                  speed = total / ( ( temps_fin - temps_debut ) / 1000 );
                }
     
                os.flush();
                is.close();
                os.close();
     
               // this.storeFile(remote, input);
     
               // input.close();
     
                this.logout();
            }
            catch (FTPConnectionClosedException e)
            {
                error = true;
                System.err.println("Server closed connection.");
                //e.printStackTrace();
            }
            catch (IOException e)
            {
                error = true;
                //e.printStackTrace();
            }
            finally
            {
                if (this.isConnected())
                {
                    try
                    {
                        this.disconnect();
                    }
                    catch (IOException f){}
                }
            }
     
         return error;
        }
     
       	public boolean TestConnexion(String server) throws SocketException, IOException			//Test si le serveur est joignable
       	{
       		boolean error = false;
     
            this.connect(server);
            int reply = this.getReplyCode();  
            if (FTPReply.isPositiveCompletion(reply))
                {
                    this.disconnect();
                    System.err.println("Connexion refusée.");             
                }
     
            return error;
       	}
        public static void main(String[] args) {
        	Ftp f = new Ftp();
        	try {
    			f.Upload("127.0.0.1", "FTPPLS", "pls91fr", "yaya.jpg", "C:\\paletsystem\\moteurFTP\\archive\\AP1450_20100303141929.jpg");
    			} 
        	catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    			}
     
        }
     
    }
    Erreur :
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at test.Ftp.Upload(Ftp.java:94)
    Taille 1024
    at test.Ftp$1.run(Ftp.java:158)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


    Au fait merci pour tes conseils pour mon IHM, ça a fonctionné nickel

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le soucis vient du code qui utilise ta classe. Donne-nous aussi le code qui appelle la méthode Upload.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    c'est le main de la class qui créer l'objet ftp.

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par HunTR Voir le message
    c'est le main de la class qui créer l'objet ftp.
    oups...
    C'est ton objet OutputStream os qui est null. Ta gestion d'erreur est incorrecte. S'il y a un soucis de connexion, tu vas quand même tenter l'envoi.
    Tu dois sortir de la méthode lorsqu'une erreur est rencontrée.

  11. #11
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    sans vouloir faire le lourd, j'ai pas trouvé de tuto qui parle de ces trucs là,
    tu as déjà vu des progress bar avec commons ftp ?

    J'ai pas compris l'histoire du soucis de connexion. Ma classe ftp fonctionne parfaitement..
    C'est le os.write( buffer, 0, taille_lue ); qui déconne.

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par HunTR Voir le message
    sans vouloir faire le lourd, j'ai pas trouvé de tuto qui parle de ces trucs là,
    tu as déjà vu des progress bar avec commons ftp ?

    un exemple au hasard

  13. #13
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Au beurre cette réponse !!
    Je ne dois pas avoir le même google que toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/02/2012, 11h57
  2. org.apache.commons.net.ftp.FTPClient méthode changeWorkingDirectory et les accents
    Par qdaemon_fr dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 08/02/2010, 16h59
  3. Envoi FTP de fichier Excel avec org.apache.commons.net.ftp
    Par TomZ dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/07/2008, 16h22
  4. [FTP API org.apache.commons.net.ftp] Commande 'Quote'
    Par JnJp28 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 30/11/2007, 12h23
  5. Réponses: 3
    Dernier message: 08/05/2006, 23h31

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