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 ?