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 :

Transfert FTP corrompu


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut Transfert FTP corrompu
    Bonjour,

    j'avais ouvert une discussion il y a quelque temps sur le problème suivant:
    lorsque je transfère en FTP, un fichier de données de mon application, vers un serveur.
    - Avec JAVA7 et Win7 -> pas de problème
    - sur un autre PC Win XP, JAVA7 -> Le fichier est corrompu. Il manque le dernier paquet d'octets. Cependant ce défaut n'apparait pas sur toutes les machines XP. La plupart du temps, cela fonctionne.

    La bibliothèque utilisée est org.apache.commons.net.ftp

    Je pensais que le problème était résolu, mais il s'avère que non. Après analyse du fichier corrompu, il manque les derniers octets, correspondant au dernier paquet envoyé. Pourtant, je ferme les flux de données !?

    voici un extrait du code exécutant le transfert vers le serveur, basé qur l'exemple founi chez org.apache:
    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
    private class CTeleTransmetFichier extends SwingWorker<Boolean, Integer>
    {
      FTPClient clientFtp = null;
     
      @Override
      protected Boolean doInBackground() throws Exception {
        File fichierLocal;
        OutputStream fluxSortie = null;
        FileInputStream fichierLecture = null;
        byte [] tampon;
        long octets_a_transferer, octets_transferes;
        int octets_lus;
     
        resultatTransfert = false;
        sFichierimport = null;
     
        // Est-ce que le fichier local existe ?
        total_octets_a_lire = 0;
        fichierLocal = new File( sLocalDossier + File.separator + sLocalFichier );
     
        if( fichierLocal.exists())
          octets_a_transferer = fichierLocal.length();
     
        if( octets_a_transferer == 0 )
        {
          traiteErreurFtp( "FICHIER INEXISTANT OU LONGUEUR INDEFINIE", this.toString() + ": Fichier local inexistant ou sa longueur indéfinie " + sLocalDossier + File.separator + sLocalFichier );
          return false;
        }
     
     
        // Préparation de la connexion:
        clientFtp = new FTPClient(); // S'occupe de faire le nécessaire pour loggin
     
        if( !preliminairesConnexionFTP( clientFtp ))
        {
          deconnexionFTP( clientFtp ); // S'occupe du nécessaire à la déconnexion
          return false;
        }
     
     
        // Préparation de la gestion des flux:
        try
        {
          fichierLecture = new FileInputStream( fichierLocal );
          fluxSortie = clientFtp.storeFileStream( sFtpFichier );
     
          if( !FTPReply.isPositivePreliminary( clientFtp.getReplyCode()))
          {
            traiteErreurFtp( "ECHEC de DIALOGUE avec le SERVEUR", this.toString() + ": " + clientFtp.getReplyString());
          }
          else
          {
            tampon = new byte[ 1024 ];
            octets_lus = -1;
            octets_transferes = 0;
     
            // Transfert de fichier
            while(( octets_lus = fichierLecture.read( tampon )) != -1 )
            {
              fluxSortie.write( tampon, 0, octets_lus );
              octets_transferes += octets_lus;
              publish( new Integer( ( int )( 100 * octets_transferes / octets_a_transferer )));
     
              if( isCancelled()) // L'utilisateur a appuyé sur le bouton STOP
              {
                C_Projet.logMessage.log( Level.INFO, "L'utilisateur a interrompu le flux de données pour " + sLocalFichier );
                break;
              }
            }
     
            // Arrivé ici signifie qu'il n'y a pas eu d'exception.
            if( octets_transferes != octets_a_transferer ) // Vérification de l'intégrité du transfert
            {
              traiteErreurFtp( "ECART OCTETS PREVUS / ENVOYES", "Nb octets prévus: " + String.valueOf( octets_a_transferer ) + "; Nb octets envoyés: " + String.valueOf( octets_transferes ));
              octets_transferes = 0;
            }
     
            if( octets_transferes != 0 ) // Tout s'est bien passé
              resultatTransfert = true;
     
          }
        }
        catch( Exception e )
        {
          traiteErreurFtp( "ERREUR lors du TRANSFERT vers SERVEUR",  e.getMessage());
        }
     
        // Fermeture des flux avant interruption connexion:
        try
        {
          if( fichierLecture != null )
          {
            fluxSortie.flush(); // J'ai rajouté ça, mais sans résultat !!
            fichierLecture.close();
          }
        }
        catch( IOException ioE )
        {
          C_Projet.logMessage.log( Level.WARNING, "Erreur de la fermeture du flux de lecture " + ioE.getMessage());
        }
     
        try
        {
          if( fluxSortie != null )
          {
            fluxSortie.close();
          }
        }
        catch( IOException ioE )
        {
          C_Projet.logMessage.log( Level.WARNING, "Erreur de la fermeture du flux de sortie " + ioE.getMessage());
        }
     
        // Fermeture connexion:
        deconnexionFTP( clientFtp );
     
        return resultatTransfert;
      }
    }
    Aucune erreur n'est détectée, et le nombre d'octets transférés correspond au nombre d'octets à transférer !!??
    Franchement je cale !

    Avez-vous une idée sur le problème ?

  2. #2
    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 : 46
    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 pense bien à appeler ftp.completePendingCommand() avant de deconnecter du serveur?

  3. #3
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bonjour Tchize,

    eh non je n'ai pas pensé à l'instruction que tu me suggères dans la mesure où je n'avais pas d'exemple indiquant l'utilisation de celle-ci.

    C'est drôle mais maintenant, je trouve plein d'exemples sur le NET, utilisant cette commande.

    Je ne veux pas me réjouir trop, en tout cas, depuis que le l'ai intégrée au code, cela fonctionne !!

    Merci beaucoup pour cette aide concis et efficace

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

Discussions similaires

  1. FTP transfert fichier corrompu
    Par rtg57 dans le forum Général Java
    Réponses: 6
    Dernier message: 16/09/2013, 22h02
  2. Réponses: 2
    Dernier message: 21/06/2005, 21h18
  3. transfert ftp avec le composant
    Par sillycoder dans le forum Composants VCL
    Réponses: 3
    Dernier message: 19/05/2005, 09h35
  4. Transfert FTP répétitif et perte de fichiers
    Par Harry dans le forum Développement
    Réponses: 3
    Dernier message: 24/06/2004, 15h15
  5. Problème de transfert FTP sous IIS
    Par thanathz dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h27

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