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

API standards et tierces Java Discussion :

Téléchargement de fichiers par protocole HTTP


Sujet :

API standards et tierces Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Téléchargement de fichiers par protocole HTTP
    Bonjour à tous,

    J'ai développé une application qui me permet de télécharger une liste d'environ 6 à 8 fichiers .swf stockés sur un serveur par le biais du protocole HTTP.

    J'ai tout d'abord utilisé l'objet urlconnection (java.net), puis cherchant une solution moins bancale, j'ai opté pour l'objet httpclient (apache).

    Je rencontre pourtant un problème récurrent : l'application essaie de télécharger le premier .swf de la liste lors de son premier lancement mais avec un débit très faible (moins de 10ko/s !), elle réussit à télécharger les deux premiers .swf de la liste lors de son deuxième lancement mais peine sur le troisième, puis réussit à télécharger l'intégralité des .swf de la liste à partir de son troisième démarrage !

    Quelles pourraient-être la(les) cause(s) ? Si vous avez des pistes, je suis preneur.

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Akabonga Voir le message
    J'ai tout d'abord utilisé l'objet urlconnection (java.net), puis cherchant une solution moins bancale, j'ai opté pour l'objet httpclient (apache).
    Pourquoi bancale ???
    HttpClient est plus complet mais s'il s'agit uniquement de télécharger un fichier URLConnection fait très bien l'affaire...

    Citation Envoyé par Akabonga Voir le message
    Quelles pourraient-être la(les) cause(s) ? Si vous avez des pistes, je suis preneur.
    Sans code difficile de t'aider...

    Ces fichiers se téléchargent bien avec un navigateur ?

    a++

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par adiGuba
    Pourquoi bancale ???
    HttpClient est plus complet mais s'il s'agit uniquement de télécharger un fichier URLConnection fait très bien l'affaire...
    Bancale n'est peut-être pas le terme approprié. Disons que je cherchais une solution stable et prête en main, au contraire de la classe URLConnection qui m'oblige à lire le fichier sur le serveur et copier morceau par morceau dans un fichier sur le pc local. Je me doute cependant que le principe reste le même avec HttpClient.

    Citation Envoyé par adiGuba
    Sans code difficile de t'aider...

    Ces fichiers se téléchargent bien avec un navigateur ?
    Oui, ces fichiers se téléchargent sans problème avec un navigateur. Ils font en général quelques centaines de Ko. Le plus gros flash pèse 7 Mo.

    Voici les deux codes utilisés :

    Code URLCONNECTION : 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
    for(tous_les_flash_de_ma_playlist){
    
        URL url = new URL(url_du_flash_de_ma_playlist)
        URLConnection connection = url.openConnection();		
        File download = new File(nom_du_flash);
    			
        if(connection.getContentLength() != download.length()){			
            try{					
                InputStream is = connection.getInputStream();
                FileOutputStream fos = new FileOutputStream(nom_du_flash);
                byte[] buffer = new byte[1024];
                int read;
                while ((read = is.read(buffer)) > 0)
                    fos.write(buffer, 0, read);
                fos.flush();
                fos.close();
                is.close();
            } catch (Exception e) {}
        }
    }

    Code HTTPCLIENT : 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
    for(tous_les_flash_de_ma_playlist){
    
        httpget = new HttpGet(url_du_flash_de_ma_playlist);
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
    			
        File download = new File(nom_du_flash);
    			
        if(entity != null && entity.getContentLength() != download.length()){			
            try{					
                FileOutputStream fos = new FileOutputStream(nom_du_flash);
                entity.writeTo(fos);
                fos.flush();
                fos.close();
            } catch (Exception e) {}
        }
        httpget.abort();
    }
    httpclient.getConnectionManager().shutdown();

    Merci de ton aide !

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est sûr que comme ca on n'est pas embêté avec les exceptions...

    a++

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Oui en fait je n'ai pas développé les exceptions dans mon copier/coller ^^

    Les voici (sachant que j'ai un fichier de log qui me sert à enregistrer le suivi de mon programme) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    }catch(IOException e){
        Log.ecrireLog("Erreur lors du téléchargement du flash "+s.getName());
    }catch(Exception e){
        Log.ecrireLog("Exception levée "+e.toString());
    }
    Le problème pourrait-il venir des exceptions ?

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Et c'est normal que tu continues ton traitement en cas d'exception ? Il n'y en a pas dans les log au moins ???

    Je rajouterais qu'il manque les try/finally et que le code ne compile pas (d'où vient writeFile ?).


    Enfin à quoi servent les comparaisons de taille ????


    a++

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par adiGuba
    Et c'est normal que tu continues ton traitement en cas d'exception ? Il n'y en a pas dans les log au moins ???
    Oui, mon programme doit pouvoir continuer son exécution même si le téléchargement d'un flash a échoué.

    Citation Envoyé par adiGuba
    Je rajouterais qu'il manque les try/finally et que le code ne compile pas (d'où vient writeFile ?).

    Enfin à quoi servent les comparaisons de taille ????
    D'accord, je vais voir ce que je peux faire de ce côté là et rajouter des clauses finally, n'étant pas très habitué à leur utilisation (pour le writeFile, j'ai corrigé, c'est une erreur de ma part).

    La comparaison de taille permet de ne télécharger que les fichiers qui ont vu leur taille être modifiée. En effet, le programme est lancé chaque jour sur plusieurs ordinateurs, et ceux-ci ne téléchargent les fichiers concernés que s'ils ont subi des modifications. Je n'ai pas trouvé meilleur critère que la taille pour comparer deux fichiers.

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	InputStream is = connection.getInputStream();
    	try {
    		FileOutputStream fos = new FileOutputStream(nom_du_flash);
    		try {
    			byte[] buffer = new byte[1024];
    			int read;
    			while ((read = is.read(buffer)) >= 0)
    				fos.write(buffer, 0, read);
    		} finally {
    			fos.close();
    		}
    	} finally {
    		is.close();
    	}
    Cela permet d'être sûr de bien libérer les flux même en cas d'exception lors du traitement...


    Sinon :
    • Vérifies également les tailles indiqués pour le fichier local et distant.
    • Essayes d'augmenter le buffer de copie.



    Sinon quand tu dis que l'application ne réussi pas à télécharger les fichiers, qu'est-ce que ca veut dire concretement ? Tu as une exception ? C'est bloqué ? Tu fermes le programmes ???


    a++

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Cela permet d'être sûr de bien libérer les flux même en cas d'exception lors du traitement...
    D'accord merci !

    Sinon :
    • Vérifies également les tailles indiqués pour le fichier local et distant.
    • Essayes d'augmenter le buffer de copie.
    Vérifier les tailles indiquées pour le fichier local et distant, cad ?
    À propos du buffer, quelle taille est conseillée pour optimiser le copiage ?

    Sinon quand tu dis que l'application ne réussi pas à télécharger les fichiers, qu'est-ce que ca veut dire concretement ? Tu as une exception ? C'est bloqué ? Tu fermes le programmes ???
    Le débit de téléchargement est très infime (de l'ordre de 10 Ko/minute) au début et diminue au fur et à mesure jusqu'à devenir presque nul (je n'ai pas la certitude qu'il s'arrête ou continue). 1h après avoir lancé le téléchargement du premier flash mais sans avoir réussi à le copier complètement, le programme ressort enfin une exception "java.net.SocketException: Connection reset" puis continue son déroulement (il n'essaye pas de télécharger les autres .swf de la liste). Je n'ai aucune exception et je ne sais pas laquelle je pourrai lever (pour éventuellement relancer le téléchargement).

    Merci pour tes réponses ^^

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Akabonga Voir le message
    Vérifier les tailles indiquées pour le fichier local et distant, cad ?
    Afficher les valeurs retournées par connection.getContentLength() et download.length()

    Citation Envoyé par Akabonga Voir le message
    À propos du buffer, quelle taille est conseillée pour optimiser le copiage ?
    En règle général c'est plutôt 8192...



    Citation Envoyé par Akabonga Voir le message
    Le débit de téléchargement est très infime (de l'ordre de 10 Ko/minute) au début et diminue au fur et à mesure jusqu'à devenir presque nul (je n'ai pas la certitude qu'il s'arrête ou continue).
    Tu calcules cela comment ???

    Citation Envoyé par Akabonga Voir le message
    1h après avoir lancé le téléchargement du premier flash mais sans avoir réussi à le copier complètement, le programme ressort enfin une exception "java.net.SocketException: Connection reset"
    Pourquoi tu ne l'as pas indiqué avant ????? Et quel est le stacktrace complet ?


    a++

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Ok pour l'affichage des tailles afin de les vérifier et ok pour le buffer, merci !

    Tu calcules cela comment ???
    En fait je vérifie moi-même la taille de mon fichier en local pendant que mon programme s'exécute :/ (je n'ai aucune indication sur son contenu par contre).

    Pourquoi tu ne l'as pas indiqué avant ????? Et quel est le stacktrace complet ?
    Je n'ai pas le stacktrace complet. L'ordinateur lance lui-même le programme au démarrage à 6h tous les matins et c'est ensuite quand je prends la main dessus que mon fichier de log me sort cette exception.

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Après plusieurs tests, je me suis rendu compte que l'arrêt du téléchargement venait du flux de lecture InputStream.

    La solution la plus simple que j'essaye de coder, est de relancer ce flux de lecture au bout d'un certain temps grâce à un(des) thread(s). Comment dois-je l'(les) organiser ?

Discussions similaires

  1. Téléchargement de fichier par protocole HTTP
    Par totos18 dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2008, 19h13
  2. Réponses: 2
    Dernier message: 07/02/2008, 10h28
  3. Réponses: 6
    Dernier message: 15/12/2006, 16h03
  4. [Configuration] Téléchargement de fichier par HTTP
    Par Thierry8 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 06/06/2006, 22h30
  5. Téléchargement de fichiers par HTTP / FTP
    Par Gladiator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 07/12/2005, 11h28

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