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 :

BufferedOutputStream sur serveur FTP


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut BufferedOutputStream sur serveur FTP
    Bonjour à tous,

    Je suis face à un problème très énigmatique..
    En effet, j'essaye de faire la copie d'un fichier sur un serveur FTP de chez Free et il s'avère que la copie ne se fait pas complètement... pas faute de faire un flush à la fin!

    Voici le code que j'utilise, qui fonctionne parfaitement pour une copie de local à local mais qui paraitrait fonctionner en distant :
    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
            FTPClient oClient;
            try {
                oClient = new FTPClient();
     
                oClient.connect("ftpperso.free.fr");
                oClient.login("nkapps", "/** mon mot de passe **/");
     
                System.out.println("Connected!");
     
                oClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                int reply = oClient.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    oClient.logout();
                    oClient.disconnect();
     
                    System.out.println("Disconnected!");
     
                    throw new IOException("Le code '" + reply + "' a été renvoyé!");
                }
     
                System.out.println("Parametred!");
     
                int iBufferSize = 1024;
                String sName = "main.jpg";
                BufferedOutputStream oFTPOut = new BufferedOutputStream(oClient.storeFileStream("copie_" + sName), iBufferSize);
                BufferedInputStream oFileIN = new BufferedInputStream(new FileInputStream("C:/" + sName));
     
                final int total = oFileIN.available();
     
                Util.copyStream(
                        oFileIN,
                        oFTPOut,
                        iBufferSize,
                        org.apache.commons.net.io.CopyStreamEvent.UNKNOWN_STREAM_SIZE,
                        new org.apache.commons.net.io.CopyStreamAdapter() {
     
                            public void bytesTransferred(long totalBytesTransferred,
                                    int bytesTransferred,
                                    long streamSize) {
                                int percentComplete = (int) ((double) totalBytesTransferred / (double) total * 100);
                                System.out.println(percentComplete + " %");
                            }
                        });
     
                oFTPOut.flush();
                oFTPOut.close();
                oFileIN.close();
     
                System.out.println("Uploaded!");
     
                oClient.logout();
                oClient.disconnect();
     
                System.out.println("Disconnected!");
     
            } catch (IOException iOException) {
            }
    Sortie de la console :
    Connected!
    Parametred!
    19 %
    39 %
    59 %
    79 %
    99 %
    100 %
    Uploaded!
    Disconnected!
    Voici l'image d'origine :
    http://nkapps.free.fr/main.jpg

    Voici la copie :
    http://nkapps.free.fr/copie_main.jpg

    Je tourne en rond depuis hier midi la dessus...

    Merci pour votre aide!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    J'avais également fait la lecture buffer par buffer de l'InputStream pour ensuite l'envoyer, mais ça me faisait déjà ce problème.. Du coup, j'ai simplifié avec la méthode Util.copyStream().

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    il y a un truc que je comprends pas : tu calcules le pourcentage d'avancement en fonction de la variable total, mais la variable total est obtenue en faisant InputStream.available(), qui ne renvoie que le nombre d'octets disponibles en cache sans IO.

    Logiquement, c'est donc très en-dessous de la taille réélle du fichier, et tu devrais donc largement dépasser les 100% avant de finir, non ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    Merci de ton intérêt pour mon problème ^^

    Pour répondre à ta question, ca me renvoie bien la taille du fichier... 5159!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    NB : Quand j'envoie des fichiers plus gros, aucun soucis.. J'ai testé avec un fichier de 14Mo!!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    Nouvelle image, taille différente, mais même soucis :

    Voici l'image d'origine :
    http://nkapps.free.fr/main2.jpg

    Voici la copie :
    http://nkapps.free.fr/copie_main2.jpg

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu peux faire au début un

    oClient.addProtocolCommandListner(new PrintCommandListener(System.out));

    et nous dire ce que ça sort ?

    Aussi, n'oublie pas le
    oClient.completePendingCommand() avant le disconnect. Je gage que tu déconnecte avant que le serveur n'ai tout reçu.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    Ceci :
    oClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
    me renvoie ceci :
    220 Serveur de mise a jour des pages perso de Free.fr version [May 5 2008 15:14:30]
    USER nkapps
    331 Password required for nkapps.
    PASS
    230 User nkapps logged in.
    TYPE I
    200 Type set to I
    Connected!
    Parametred!
    PORT 192,168,0,1,12,110
    200 PORT command successful.
    STOR copie_main2.jpg
    150 Opening BINARY mode data connection for copie_main2.jpg
    total=5837
    17 %
    35 %
    52 %
    70 %
    87 %
    100 %
    Uploaded!
    QUIT
    221 Goodbye.
    Disconnected!

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu dois attendre le
    avant de quitter (cf mon message plus haut)

  10. #10
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il a raison il ne faut pas se baser sur avaible() qui ne retourne pas la taille des données, mais la quantité de données accessibles sans blocage. Cette valeur pourrait même changer selon l'implémentation...
    Utilises File.length() à la place !


    Sinon Util.copyStream() utilise déjà un buffer interne. Donc inutile d'en rajouter une couche en utilisant les Bufferer*Stream...


    Enfin il manque les try/finally pour la libération des ressources !



    Quand à ton problème, vérifie toujours le "reply code" renvoyé par le FTP... on ne sait jamais


    a++

    [edit] Un peu grillé : 4 nouveaux messages pendant que je postais

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    Merci à vous!
    En effet, le fait de pas mettre le completePendingCommand() me mettais une sacré épine dans le pied...

    Encore merci à vous!

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

Discussions similaires

  1. [FTP] Upload sur serveur FTP local
    Par per_ewan dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2007, 23h53
  2. [FTP] Gestion fichier PHP sur serveur FTP
    Par cdrik59 dans le forum Langage
    Réponses: 1
    Dernier message: 08/12/2006, 16h00
  3. Pb de loging sur serveur FTP
    Par dede92 dans le forum Développement
    Réponses: 1
    Dernier message: 21/10/2006, 18h24
  4. Réponses: 5
    Dernier message: 30/11/2005, 09h48

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