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

Entrée/Sortie Java Discussion :

télécharger un fichier a partir d'une URL


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut télécharger un fichier a partir d'une URL
    Bonjour
    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
    //il fait parti d'un pakage que j'avais commencer mais dont je n'ai pas le courrage de finir 
    //package com.daedric.net.HTTP; 
    import java.net.*; 
    import java.io.*; 
     
     
     
    //declaration de la classe 
     
    public class HTTPGetFile { 
    //constructeur de la classe : elle prend pour argument une chaine de caractere.... 
      protected String letype;
      protected String erreur="";
      protected int lenght;
      protected String montexte;
      public HTTPGetFile(String HOST, String lechemin) { 
     
     
          try { 
             //.... et l'utilise pour initialiser une url 
            URL racine = new URL(HOST); 
             //appel la methode getFile sur l'url pour commencer a recuperer le fichier 
             getFile(racine, lechemin); 
          }catch (MalformedURLException e) {erreur=erreur+(HOST + " : URL non comprise.");} 
           catch (IOException e) {  erreur=erreur+e.getMessage(); 
          } 
    // ces ligne sont entoure d'un bloc try au cas ou il y aurait des exeption : par exemple si l'url n'es pas valide 
     
      } 
    // commencement de get file avec comme argument l'url 
     
      public  void getFile(URL u, String lechemin) throws IOException { 
        //ouvre la connection 
        URLConnection uc = u.openConnection( ); 
        // regarde quel type est le fichier a telecharger 
        letype = uc.getContentType( ); 
        // recupere la taille du fichier ..... 
        int FileLenght = uc.getContentLength( ); 
        //uc.getContentEncoding();
        //....pour tester si c'est un fichier valide .
        if (FileLenght == -1 ) { 
     
         // erreur =erreur + "Fichier <font color=red>non</font> valide : (taille = -1) "+"</font>encoding : <font color=red>"+uc.getContentEncoding()+"  </font> &nbsp type :<font color=red>"+uc.getContentType()+"</font> &nbsp la taille : <font color=red>"+uc.getContentLength()+" </font> ";
        // erreur = erreur+" header : "+uc.getHeaderField()+" HEADER : "+uc.getHeaderFieldInt();
          throw new IOException( "Fichier <font color=red>non</font> valide : (taille = -1) "+"</font>encoding : <font color=red>"+uc.getContentEncoding()+"  </font> &nbsp type :<font color=red>"+uc.getContentType()+"</font> &nbsp la taille : <font color=red>"+uc.getContentLength()+" </font> "); 
        } 
        // le bloc si dessous jusqu'a entree.close permet de copier le fichier 
        // bit par bit ,en utilisant un tableau ,sur l'ordinnateur dans le repertoir local 
     //  uc.setRequestProperty()
        InputStream brut = uc.getInputStream( ); 
        InputStream entree = new BufferedInputStream(brut); 
        byte[] donnees = new byte[FileLenght]; 
        int BitRead = 0; 
        int deplacement = 0; 
        while (deplacement < FileLenght) { 
           BitRead = entree.read(donnees, deplacement, donnees.length-deplacement); 
           if (BitRead == -1) break; 
           //if (BitRead == '\n'){}
           deplacement += BitRead; 
        } 
        erreur =erreur + "<font color=green>Fichier  valide :   "+"</font>encoding : <font color=green>"+uc.getContentEncoding()+" </font> &nbsp type : <font color=green>"+uc.getContentType()+" </font>&nbsp la taille : <font color=green>"+uc.getContentLength()+"</font> "; 
        // ferme le flux 
        entree.close( ); 
        // regarder si le fichier est valide 
        if (deplacement != FileLenght) { 
          throw new IOException("Nous n'avons lu que " + deplacement 
           + " octets au lieu des " + FileLenght + " attendus"); 
        } 
        // recuperation de l'url pour une .... 
        //String FileName = u.getFile( ); 
        //....decortication de la chaine pour avoir le nom du fichier 
        //FileName = FileName.substring(FileName.lastIndexOf('/') + 1); 
        // ouverture d'un flux de donnee pour ecrire le fichier 
        FileOutputStream WritenFile = new FileOutputStream(lechemin); 
    // ecrit le fichier sur l'ordinnateur 
        WritenFile.write(donnees); 
    //vide le tampon au cas ou tout ne serai pas ecris 
        WritenFile.flush( ); 
    //ferme le flux 
        WritenFile.close( );
       // String trans = new String(donnees);
      // montexte = trans;
      // lenght = montexte.length();
       //return montexte;
      } 
    }

    Voila quand je télécharge une série de fichier, mon code n'en récupere que la moitié, j'ai essayé d'analysé l'encodage du fichier mais apparement ce n'est pas ça , je comprend pas pourquoi il n'en obtient que la moitié ...

    Quelqun a t'il une solution ?

  2. #2
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    le code est de moi

    as tu une exception ? c'est quoi comme type de fichier ?

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je ne me suis pas penché sur le code en détail mais j'ai plusieurs remarques.
    • Par convention, le nom des variables doit commencer par une minuscule.
    • Les fluxs doivent être fermés dans des blocs try/finally (sujet plusieurs fois abordé sur le forum).
    • Il serait préférable de wrapper le FileOutputStream dans un BufferedOutputStream.
    • Pour la séquence de lecture il est déconseillé d'utiliser un buffer de la taille du fichier (si le fichier fait plusieurs 100aines de MO cela risque de mal se passer ). En général on utilise un buffer de quelque ko (souvent 1024 ou 2048 octets) et on effectue l'écriture vers le flux de sortie au fur et à mesure de la lecture.
    • Pour cette même séquence la condition de sortie de la boucle est généralement lorsque le nombre d'octets lus est égal à 0.
    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
    public  void getFile(URL u, String lechemin) throws IOException {
        //ouvre la connection 
        URLConnection uc = u.openConnection( ); 
        // regarde quel type est le fichier a telecharger 
        letype = uc.getContentType( ); 
        // recupere la taille du fichier ..... 
        int fileLenght = uc.getContentLength( ); 
        //uc.getContentEncoding();
        //....pour tester si c'est un fichier valide .
        if (fileLenght == -1 ) { 
            throw new IOException( "Fichier <font color=red>non</font> valide : (taille = -1) "+"</font>encoding : <font color=red>"+uc.getContentEncoding()+"  </font> &nbsp type :<font color=red>"+uc.getContentType()+"</font> &nbsp la taille : <font color=red>"+uc.getContentLength()+" </font> "); 
        }
        BufferedInputStream bis = new BufferedInputStream(uc.getInputStream( ));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(lechemin));
        byte[] data = new byte[2048]; 
        int nbRead = 0;
        int deplacement = 0;
        try {
            while ((nbRead = bis.read(data)) > 0) { 
                bos.write(data, 0, nbRead);
                bos.flush();
                deplacement += nbRead;
            } 
        } finally {
            try {
                bis.close();
            } finally {
                bos.close();
            }
        }
        if (deplacement != fileLenght) { 
            throw new IOException("Nous n'avons lu que " + deplacement 
                    + " octets au lieu des " + fileLenght + " attendus"); 
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    je suis d'accord avec toi mais je n'ai jamais eut le courage de refaire ce code lol

    il n'est la que pour donner une idee general de comment faire

    de plus je ne l'avais prevu que pour les petit fichier de au plus deux ou trois mega cet methode en valais donc une autre

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    Apparement mon problème serait plus un problème de format, étant donné que je n'ai aucun problème pour le téléchargement des fichiers "application/pdf" par contre pour le téléchargement des fichiers web c'est assez aléatoire je ne comprend pas ce qui me fait foirer.
    De plus les retours chariots ne sont pas intérprété une fois que je met mes octets dans une String
    String chaineaparser = new String (byte[]);
    Pour l'instant j'ai adapté mon code en n'utilisant cette façon de dl que pour les "application/pdf" mais je trouve ça fort domage étant donné que ce code est largement plus efficace que ce que j'utilisé (readline() ) :

    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
     
    //il fait parti d'un pakage que j'avais commencer mais dont je n'ai pas le courrage de finir 
    //package com.daedric.net.HTTP; 
    import java.net.*; 
    import java.io.*; 
     
     
     
    //declaration de la classe 
     
    public class HTTPGetFile { 
    //constructeur de la classe : elle prend pour argument une chaine de caractere.... 
      protected String letype;
      protected String erreur="";
      protected int lenght;
      protected String montexte;
      public HTTPGetFile(String HOST, String lechemin,int a,String requete, String langagechoisi) { 
     
     
          try { 
             //.... et l'utilise pour initialiser une url 
            URL racine = new URL(HOST); 
             //appel la methode getFile sur l'url pour commencer a recuperer le fichier 
             getFile(racine, lechemin, a, HOST,  langagechoisi, requete); 
          }catch (MalformedURLException e) {erreur=erreur+(HOST + " : URL non comprise.");} 
           catch (IOException e) {  erreur=erreur+e.getMessage(); 
          } 
    // ces ligne sont entoure d'un bloc try au cas ou il y aurait des exeption : par exemple si l'url n'es pas valide 
     
      } 
    // commencement de get file avec comme argument l'url 
     
      public  void getFile(URL u, String lechemin, int a,String url, String langagechoisi, String larequete) throws IOException { 
        //ouvre la connection 
        URLConnection uc = u.openConnection( ); 
        // regarde quel type est le fichier a telecharger 
        letype = uc.getContentType( ); 
        // recupere la taille du fichier ..... 
        int FileLenght = uc.getContentLength( ); 
        //uc.getContentEncoding();
        //....pour tester si c'est un fichier valide .
        if (letype == null){letype="over";erreur = erreur + "requete : <font color=blue><i>"+larequete+"</i></font> (<font color=purple>"+langagechoisi+"</font>) : <a href=\""+url+"\"> lien"+a+"</a>  Erreur 404 le fichier n'existe pas (lien brisé)<br>";}
        else{
        if(letype.equals("application/pdf")) {
        if (FileLenght == -1 ) { 
        throw new IOException( "Fichier <font color=red>non</font> valide : (taille = -1) "+"</font>encoding : <font color=red>"+uc.getContentEncoding()+"  </font> &nbsp type :<font color=red>"+uc.getContentType()+"</font> &nbsp la taille : <font color=red>"+uc.getContentLength()+" </font> "); 
        } 
        // le bloc si dessous jusqu'a entree.close permet de copier le fichier 
        // bit par bit ,en utilisant un tableau ,sur l'ordinnateur dans le repertoir local 
     //  uc.setRequestProperty()
     
     
     
        InputStream brut = uc.getInputStream( ); 
        InputStream entree = new BufferedInputStream(brut); 
        byte[] donnees = new byte[FileLenght]; 
        int BitRead = 0; 
        int deplacement = 0; 
        while (deplacement < FileLenght) { 
           BitRead = entree.read(donnees, deplacement, donnees.length-deplacement); 
           if (BitRead == -1) break; 
           //if (BitRead == '\n'){}
           deplacement += BitRead; 
        } 
        lenght = donnees.length;
       //erreur =erreur + "<font color=green>Fichier  valide :   "+"</font>encoding : <font color=green>"+uc.getContentEncoding()+" </font> &nbsp type : <font color=green>"+uc.getContentType()+" </font>&nbsp la taille : <font color=green>"+uc.getContentLength()+"</font> "; 
        // ferme le flux 
        entree.close( ); 
        // regarder si le fichier est valide 
        if (deplacement != FileLenght) { 
          throw new IOException("Nous n'avons lu que " + deplacement 
           + " octets au lieu des " + FileLenght + " attendus"); 
        } 
        // recuperation de l'url pour une .... 
        //String FileName = u.getFile( ); 
        //....decortication de la chaine pour avoir le nom du fichier 
        //FileName = FileName.substring(FileName.lastIndexOf('/') + 1); 
        // ouverture d'un flux de donnee pour ecrire le fichier 
        FileOutputStream WritenFile = new FileOutputStream(lechemin); 
    // ecrit le fichier sur l'ordinnateur 
        WritenFile.write(donnees); 
    //vide le tampon au cas ou tout ne serai pas ecris 
        WritenFile.flush( ); 
    //ferme le flux 
        WritenFile.close( );
       // String trans = new String(donnees);
      } 
     
        else //if(!(letype.equals("application/pdf")))
        {
        	InputStream ips = u.openStream(); //gestion de la connection grâce à cet objet
     
    		 //gestion du flux de l'url
        	 String ligne;
    		 BufferedReader in=new BufferedReader(new InputStreamReader(ips));
    		 while ((ligne=in.readLine())!=null){ligne=ligne+" ";montexte=montexte+ligne;}
    		 in.close();
    		 lenght= montexte.length();
    		 FileOutputStream  fichtraitement;
    		 try{
                  fichtraitement = new FileOutputStream(lechemin);
                  fichtraitement.write(("<!- "+u.getHost()+"-->"+"\r\n\r\n"+montexte).getBytes());
                  fichtraitement.close();
    		 }catch (IOException exc ){erreur=erreur+"requete : ("+larequete+" ("+langagechoisi+")) google : lien"+a+" " +exc.getMessage()+"<br>";}
     
        }}
      }
    }
    Si quelqu'un a une solution thx

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Apparement tu n'as pas pris en compte mes remarques .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Citation Envoyé par le y@m's
    Apparement tu n'as pas pris en compte mes remarques .
    J'ajouterais si je puis me permettre de mettre une longueur courte de code, et en tous les cas qu'on soit pas obligé de scroller horizontalement et verticalement pour suivre...

  8. #8
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    essai de te debrouiller avec ca :

    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
    private void readFile(InputStream in) throws IOException {
     
    		byte[] buf = new byte[8192];
     
    		FileOutputStream out = new FileOutputStream(".\\map\\map.zmap");
     
    		int lu = 0;
     
    		do {
     
    			lu = in.read(buf);
     
    			if (lu > 0) {
     
    				out.write(buf, 0, lu);
     
    				if (lu < 8192)
     
    					break;
     
    			}
     
     
     
    		} while (lu > 0);
     
     
     
    		out.flush();
     
    		out.close();
     
    			}

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par daedric
    essai de te debrouiller avec ca :

    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
    private void readFile(InputStream in) throws IOException {
     
            byte[] buf = new byte[8192];
     
            FileOutputStream out = new FileOutputStream(".\\map\\map.zmap");
     
            int lu = 0;
     
            do {
     
                lu = in.read(buf);
     
                if (lu > 0) {
     
                    out.write(buf, 0, lu);
     
                    if (lu < 8192)
     
                        break;
     
                }
     
     
     
            } while (lu > 0);
     
     
     
            out.flush();
     
            out.close();
     
                }
    Je vais me répèter mais ...
    Citation Envoyé par le y@m's
    • Les fluxs doivent être fermés dans des blocs try/finally (sujet plusieurs fois abordé sur le forum).
    • Il serait préférable de wrapper le FileOutputStream dans un BufferedOutputStream.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/08/2010, 12h06
  2. lire un fichier cvs à partir d'une url
    Par denis.ws dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 17/05/2008, 18h13
  3. Lire un fichier XML à partir d'une URL
    Par spaukensen dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2008, 11h03
  4. [ java.net ] récupérer un fichier PDF à partir d'une URL
    Par nico2280 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2005, 11h09
  5. [DOM] [JAVA + XML] Ouvrir un fichier xml à partir d'une url
    Par Hell dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/06/2005, 00h06

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