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

Java Discussion :

FTP transfert fichier corrompu


Sujet :

Java

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

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut FTP transfert fichier corrompu
    Bonjour,

    le problème est le suivant:
    je transfère et télécharge les fichiers de données de l'application que j'ai développée vers un serveur.
    Quand on transfère le fichier vers le serveur:
    - Avec JAVA7 et Win7 -> pas de problème
    - sur un autre PC Win XP, JAVA7 -> Le fichier est corrompu. Apparemment, il manque un petit morceau du fichier stocké sur le serveur.

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

    2 questions:
    - avez-vous eu une expérience similaire, et si oui, qu'elle fut la solution ?
    - Avez-vous des astuce pour pister une corruption de fichier ?

    voici un extrait du code exécutant le transfert vers le serveur:
    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
     
    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 total_octets_a_lire, total_octets_lus;
        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())
          total_octets_a_lire = fichierLocal.length();
     
        if( total_octets_a_lire == 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();
     
        if( !preliminairesConnexionFTP( clientFtp ))
        {
          deconnexionFTP( clientFtp );
          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[ 4096 ];
            octets_lus = -1;
            total_octets_lus = 0;
     
            // Transfert de fichier
            while(( octets_lus = fichierLecture.read( tampon )) != -1 )
            {
              fluxSortie.write( tampon, 0, octets_lus );
              total_octets_lus += octets_lus;
              publish( new Integer( ( int )( 100 * total_octets_lus / total_octets_a_lire )));
     
              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.
            resultatTransfert = true;
          }
        }
        catch( Exception e )
        {
          traiteErreurFtp( "ERREUR lors du TRANSFERT vers SERVEUR",  e.getMessage());
        }
     
        // Fermeture des flux avant interruption connexion:
        try
        {
          if( fichierLecture != null )
          {
            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;
      }
    }
    Merci par avance...
    @ bientôt...

    Salut & @+ sur 3W!

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Ici, j'ai une petite gêne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            tampon = new byte[ 4096 ];
            octets_lus = -1;
            total_octets_lus = 0;
     
            // Transfert de fichier
            while(( octets_lus = fichierLecture.read( tampon )) != -1 )
    A aucunb moment tu ne spécifie à la fonction de lecture que la taille du tampon est de 4096 octets.

    Ou bien tu lis ligne par ligne (je ne sais pas comment fonctionne la fonction read) et tu es sûr qu'aucune ligne ne fait plus de 4096 octets
    ou bien tu risques de déborder dans ta pile
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Euh, non. Je sais pas quel est le problème (moi ça marche,) mais c'est pas ça.

    Il y a pas besoin de dire la taille du tableau, en Java l'appelé peut très bien la regarder lui-même.
    Il ne la dépassera pas (ou s'il le fait, c'est un super giga-bug, parce que personne irait supposer qu'il penserait pas tout seul à ne pas dépasser.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour et merci de vous intéresser à ce cas.

    La méthode utilisée est celle décrite sur le site http://commons.apache.org/proper/commons-net/
    J'ai simplement un peu 'francisé' le code.

    Je précise aussi que cela ne fonctionne pas sur certains PC seulement.
    Je mène l'enquête du côté du pare-feu, de l'antivirus...
    Est-ce que cela peut provenir du serveur hébergeant les fichiers ?
    Je n'y crois pas trop car, si cela fonctionne dans certains cas...pourquoi pas dans tous les cas ?

    La seule chose qui est a peu près sûre, c'est que la corruption se fait sur la fin de fichier...
    @ bientôt...

    Salut & @+ sur 3W!

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Il y a pas besoin de dire la taille du tableau, en Java l'appelé peut très bien la regarder lui-même.
    Ha oui, c'est vrai qu'avec Java, l'appelé, peut connaitre la taille d'un tableau passé en paramètre, j'avais oublié (c'est pas du C ).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Je précise aussi que cela ne fonctionne pas sur certains PC seulement.
    Je mène l'enquête du côté du pare-feu, de l'antivirus...
    Est-ce que cela peut provenir du serveur hébergeant les fichiers ?
    Je n'y crois pas trop car, si cela fonctionne dans certains cas...pourquoi pas dans tous les cas ?
    Pas de message d'erreur ? Je vois que tu loggues en cas d'exception...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonsoir,

    je reviens vers vous car j'ai trouvé la solution:
    les PC sur lesquels cela ne fonctionne pas, ont un OS de type 32 bits.
    Alors je me suis dit que peut être qu'ils fonctionnent aussi en FAT32 ou quelque chose dans ce genre.

    Du coup, au lieu de faire un buffer de 4096 octets, je suis descendu à 1024 octets. Et là, cela à l'air de fonctionner... allez savoir pourquoi !?

    A noter dans les tablettes !!
    @ bientôt...

    Salut & @+ sur 3W!

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

Discussions similaires

  1. [FTP] Transfert fichiers qui portent un nom avec accent
    Par wajdinho dans le forum Général Java
    Réponses: 2
    Dernier message: 25/03/2013, 12h26
  2. transfert fichiers corrompu
    Par Meuha dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 04/03/2010, 12h03
  3. Transfert fichier par FTP
    Par j_bolduc dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/11/2005, 19h59
  4. [FTP] transfert de fichiers utilisant le protocole ftp
    Par ista9im dans le forum Langage
    Réponses: 1
    Dernier message: 30/09/2005, 16h49
  5. [] [Réseau] Transfert fichier sur un FTP
    Par CYFL dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/02/2003, 17h33

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