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

Langage Java Discussion :

Transfert de fichier pdf


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut Transfert de fichier pdf
    Bonjour,

    j'ai un morceau de code qui fonctionne, le voici le voilà :
    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
     
    fichierAEnvoye = new File("e:\\CoffreFort\\recv.pdf");
    try
    {
    	StreamClientFile = new FileInputStream(fichierAEnvoye);		
    	DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("c:\\essai.pdf")));
     
    	long tailleMaxBuffer = 1024;
    	long tailleFichier = fichierAEnvoye.length();
    	long envoye = 0;
     
    	long tailleFinaleBuffer = fichierAEnvoye.length()-envoye;
    	byte tmpbuf[] = new byte[(int)tailleFinaleBuffer];
    	envoye += StreamClientFile.read(tmpbuf);
    	dos.write(tmpbuf);
     
    	System.out.println("J'ai envoyé "+envoye+" octets.");
     
    }
    	catch(Exception exc)
    	{
    		System.out.println("Exception : "+exc);
    	}
    et quand je passe à la version avec des buffers, ca ne fonctionne plus :
    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
     
    fichierAEnvoye = new File("e:\\CoffreFort\\recv.pdf");
    try
    {
    	StreamClientFile = new FileInputStream(fichierAEnvoye);		
    	DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("c:\\essai.pdf")));
     
    	long tailleMaxBuffer = 1024;
    	long tailleFichier = fichierAEnvoye.length();
    	long envoye = 0;
     
    	while(tailleFichier - envoye > tailleMaxBuffer)
    	{
    		byte tmpbuf[] = new byte[(int)tailleMaxBuffer];
    		envoye += StreamClientFile.read(tmpbuf);
    		dos.write(tmpbuf);
    	}
     
    	long tailleFinaleBuffer = fichierAEnvoye.length()-envoye;
    	byte tmpbuf[] = new byte[(int)tailleFinaleBuffer];
    	envoye += StreamClientFile.read(tmpbuf);
    	dos.write(tmpbuf);
     
    	System.out.println("J'ai envoyé "+envoye+" octets.");
     
    }
    catch(Exception exc)
    {
    	System.out.println("Exception : "+exc);
    }
    Dans le premier cas, j'ai l'intégralité du fichier, dans le deuxième cas, il semblerait qu'il manque des données à la fin du fichier.

    Vous allez me dire que mon code ne fait que copier un fichier pdf et qu'il y a pleins d'aures méthodes. Moi, ce que j'aimerais c'est qlqchose de proche car en réalité, mon code est beaucoup plus large (utilisation de sockets réseau SSL à travers lesquels doivent transiter les fichiers pdf).

    D'avance merci

  2. #2
    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,


    Quelques remarques sur ton code :
    • Pas de fermeture des flux (dans des bloc finally)
    • Pourquoi créer le tableau de byte dans la boucle ? Pourquoi ne pas l'allouer avant et ainsi économiser de la mémoire...
    • Pourquoi calculer le nombre de caractère à lire ??? Cela fait de nombreux calcul, et de plus cela duplique du code pour gérer la fin de lecture (lorsque le buffer est plus petit). Une simple boucle while peut suffire...
    • Pourquoi utiliser un DataOutputStream ? Et à la rigueur tu pourrais même te passer du BufferedOutputStream puisque tu gère déjà un buffer (il faudrait utiliser un buffer de 8192 pour être équivalent).
    • Enfin concernant les exceptions, un printStackTrace() est bien plus instructif sur l'erreur... mais perso je préfère faire remonter l'erreur afin de la gérer plus haut (sinon on ne peut pas savoir si le traitement à marché ou pas...
    Ce qui donnerais :
    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
            fichierAEnvoye = new File("e:\\CoffreFort\\recv.pdf");
            try
            {
                InputStream streamClientFile = new FileInputStream(fichierAEnvoye);        
                try {
                    OutputStream os = new FileOutputStream("c:\\essai.pdf");
                    try {
                        byte tmpbuf[] = new byte[8192]; // Buffer de lecture
                        int len; // Nombre de byte lu dans le buffer
                        int envoye = 0;
     
                        // Tant qu'on lit des données depuis le fichier :
                        while ( (len=streamClientFile.read(tmpbuf)) > 0 ) {
                            os.write(tmpbuf, 0, len);
                            envoye += len;
                        }
                        System.out.println("J'ai envoyé "+envoye+" octets.");
                    } finally {
                        os.close();
                    }
                } finally {
                    streamClientFile.close();
                }    
            }
            catch(Exception exc) {
                System.out.println("Exception : "+exc);
                exc.printStackTrace();
            }
    a++

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut Flush
    La solution est la suivante : il manque un dos.flush() pour éviter ces comportements étranges.
    Merci pour les remarques, je vais me pencher dessus.

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

Discussions similaires

  1. [FPDF] conflit entre transfert de paramètres et génération d'un fichier pdf
    Par itmak dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/06/2009, 14h24
  2. web service axis transfert de fichier pdf
    Par auriane dans le forum Services Web
    Réponses: 6
    Dernier message: 19/03/2008, 11h22
  3. Streaming fichier PDF
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 22/05/2003, 22h14
  4. [Socket]Transfert de fichier
    Par Aminos dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/04/2003, 13h58
  5. [XMLRAD] Fichier PDF
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 09/01/2003, 10h19

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