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

Servlets/JSP Java Discussion :

Transfert incomplet de fichier via une servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre habitué
    Avatar de benjamin_musique
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 182
    Points
    182
    Billets dans le blog
    1
    Par défaut Transfert incomplet de fichier via une servlet
    Bonjour à tous,

    je remets sur le tapis un problème qui a l'air récurant
    ( cf. http://www.developpez.net/forums/sho...nsfert+fichier) mais qui n'a jamais trouvé vraiment de réponse dans les post que j'ai pus parcourir.

    Il s'agit de transférer un fichier PDF à l'aide d'une servlet :
    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
     
    // Lecture du fichier sur le FS du serveur
    File file = new java.io.File(lsOutputRootDir + lsNomFichierResult);
    FileInputStream lFileInputStream = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(lFileInputStream);
    int bytes = (int) file.length();
    byte[] buffer = new byte[bytes];
    int readBytes = bis.read(buffer);
    bis.close();
    lFileInputStream.close();
     
    // Controle de la lecture du fichier
    cLogger.debug("Nb d'octets du fichiers :"+bytes+" Nb octets lus :"+readBytes);
     
    // Envoie du fichier dans la reponse HTTP
    pResponse.setContentType("application/pdf");
    pResponse.setHeader("Content-disposition", "inline; filename=" + lsNomFichierResult);
    pResponse.setContentLength(buffer.length);
    final ServletOutputStream stream = pResponse.getOutputStream();
    stream.write(buffer, 0, readBytes);
    stream.flush();
    stream.close();
    Je récupère le fichier avec le client java suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Lecture sur la socket HTTP
    lUrl = new URL(lUrlString);
    lConnexion = lUrl.openConnection();
    lBuffer = new byte[lConnexion.getContentLength()];
    lInputStream = lConnexion.getInputStream();
    lNbOctetLu = lInputStream.read(lBuffer);			
    lInputStream.close();
     
    // Controle
    if (lNbOctetLu != lConnexion.getContentLength()) {
        throw new Exception("Le fichier est incomplet : nb octets envoyés="+lConnexion.getContentLength()+", nb octets lus="+lNbOctetLu);
    }
    Ce code marche dans 80% des cas, et dans 20% le nombre d'octet reçu est inférieur à celui envoyé (et le fichier est incomplet) .

    Je ne vois pas d'erreur dans le code, et je commence un peu à sécher.
    Peut-être un problème de configuration du serveur d'application (WAS 4)? Un problème réseau? Quelqu'un a une idée? je suis preneur!
    Merci

  2. #2
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    Ton problème est à la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lNbOctetLu = lInputStream.read(lBuffer);
    La javadoc sur read(byte[]) dit exactement ceci
    Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.
    La doc n'a jamais dit qu'on lisait tout d'un coup. En fait, sur une URLConnection, la méthode va lire uniquement ce qui est disponible dans la socket. Plus tes fichiers sont gros et plus il y a de la congestion réseau, plus tu aura ton fichier par petits bouts.
    Ta méthode read() doit être utilisé dans une boucle qui remplit ton tableau au fur et à mesure et ne s'arrête que quand read() renvoie -1, là t'es sur que t'as lu tout ce que le serveur t'as envoyé.

  3. #3
    Membre habitué
    Avatar de benjamin_musique
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 182
    Points
    182
    Billets dans le blog
    1
    Par défaut
    ok!

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

Discussions similaires

  1. Upload de Fichier via une Servlet HTTP
    Par tagsOf dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 01/11/2008, 17h53
  2. Réponses: 2
    Dernier message: 15/02/2006, 17h35
  3. [JAVA] Probleme de connexion a ACCESS via une Servlet.
    Par rider4ever dans le forum Access
    Réponses: 8
    Dernier message: 10/02/2006, 18h45
  4. Accéder au contenu d'un fichier via une URL en mode binaire
    Par sbelli dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/10/2005, 10h25
  5. [STRUTS][DOWNLOAD] download d'un fichier via une action
    Par FreshVic dans le forum Struts 1
    Réponses: 3
    Dernier message: 16/04/2004, 16h38

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