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 :

Téléchargement partiel d'un fichier


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut Téléchargement partiel d'un fichier
    Salut !

    Je viens demander un p'tit coup de main afin de cerner mon problème. Voici une portion du code de ma servlet DownloadDocument permettant l'accès à un document en ligne. Les lignes en oranges sont mes dernières modifications suite à ma balade matinale sur Internet à la recherche d'explications.

    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
        // Tell the browser that the received data is a file.
        p_oResponse.setContentType("application/octet-stream");
        // Avoid "DownloadDocument" as the title of the downloaded document.
        p_oResponse.setHeader("Content-Disposition", "attachment; filename=\""
                + oDocument.getName() + "\"");
        FileInputStream oInput = null;
        try
        {
            File oFile = new File(oDocument.getAbsolutePath());
            p_oResponse.setContentLength((int)oFile.length());
            oInput = new FileInputStream(oFile);
            BufferedOutputStream oOutput = new BufferedOutputStream(p_oResponse
                    .getOutputStream());
    
            int iPacketSize = 1024;
            byte[] aBytes = new byte[iPacketSize];
            int iReadBytesCount = 0;
            while((iReadBytesCount = oInput.read(aBytes, 0, iPacketSize)) > -1)
            {
                oOutput.write(aBytes, 0, iReadBytesCount);
                oTraceOutput.write(aBytes, 0, iReadBytesCount);
            }
    
            oOutput.flush();
            oOutput.close();
        }
        catch(Exception oException)
        {
            throw oException;
        }
        finally
        {
            if(oInput != null)
            {
                oInput.close();
            }
        }
    Pour vous décrire le problème... il n'y en n'a pas ! x) Enfin, si, mais je n'arrive pas à le reproduire. C'est un client qui nous a remonté l'information, chez lui le problème semble survenir régulièrement. Lorsqu'il télécharge un document celui-ci n'est qu'en partie transmis.
    J'ai fait un test pour vérifier ses dires : lorsqu'un document est téléchargé le serveur me laisse une trace de ce qui est émis sur le flux de sortie en créant un document temporaire. J'ai donc pu constater, en effet, que les documents n'étaient que partiellement transmis...

    Est-ce qu'à première vue mon code comporte des fautes ? Des lacunes qui rendraient possibles ce genre de mésaventures ? À seconde vue ?.. ^^'

    En manipulant mon outils je me suis apperçu que lorsqu'un navigateur s'adressait à mon serveur afin d'obtenir un document il commence parfois le téléchargement avant même que l'utilisateur ne confirme sa volonté d'obtenir le document. Une sorte d'anticipation j'imagine.
    J'ai aussi pu constaté que lorsqu'on annule un téléchargement, bien évidemment, l'écriture dans le flux est interrompue à la demande de l'utilisateur et la trace que j'ai du transfert est donc, cette fois encore, partielle.

    Je n'arrive donc pas à isoler le cas de figure qui ferait que le téléchargement se fait de manière partielle sans intervention de l'utilisateur (puisque le client s'étonne que ça ne marche pas j'imagine qu'il ne fait pas exprès d'annuler le téléchargement - si c'est une question d'annulation).

    Une idée ? Deux idées ?.. Inspirés ? ^^'

    Merci à vous !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 53
    Par défaut
    Salut,

    Pour optimiser un peu tu peux :
    1 - Passer par un BufferedInputStream
    2 - Spécifier la taille du buffer dans le constructeur de BufferedInputStream et BufferedOutputStream
    3 - augmenter la taille du buffer (1ko, c'est pas assez à mon gout, je met habituellement 64ko)
    4 - éviter d'écrire des logs dans la boucle

    Sinon, rien de flagrant...

    Bon courage,

    Laurent

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Ok, merci pour tes idées, je vais sans doute augmenter la taille de mes paquets.

    Depuis l'ouverture de ce billet j'ai pu constater que notre client avait téléchargé deux fois des documents dans notre application et il n'a rencontré aucun problème. Peut être que le fait d'avoir spécifié la taille du contenu émis sur le flux de sortie y est pour quelque chose.

Discussions similaires

  1. Problème de lecture partielle d'un fichier
    Par erloroloco dans le forum Fortran
    Réponses: 3
    Dernier message: 01/12/2007, 13h27
  2. Problème avec le téléchargement forcé d'un fichier
    Par sunshine33 dans le forum Langage
    Réponses: 14
    Dernier message: 08/11/2006, 10h24
  3. Téléchargement et ouverture de fichier
    Par Nathan dans le forum Langage
    Réponses: 5
    Dernier message: 08/09/2006, 16h18
  4. téléchargement forcé, taille du fichier nulle
    Par manaboko dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2005, 11h45

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