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 distant


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 484
    Par défaut Télécharger un fichier distant
    Bonjour,
    Je cherche a télécharger un fichier distant via HTTP afin de l'écrire dans un fichier en local. J'ai essayé avec le code fournis dans la FAQ ici mais ca ne marche pas.
    Donc je fais appel a vous pour m'aider.
    Merci d'avance

  2. #2
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut URL file copy
    Eh bien les URL font l'affaire dans le cas de téléchargements je pense.
    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
     
    /** télécharger depuis ftp://www.developpez.com/ vers local*/
    String src, dst;
    src = "http://ydisanto.ftp-developpez.com/tutoriels/j2se/runtime/runtime.zip";
    dst = "file:///c:/ftp/runtime.zip";
    if(copier(new File(new URL(src)), new File(new URL(dst))))
        throw new Exception("Erreur de copie de " + src + " à " + dst + " !");
     
    /**************** source FAQ Flux et réseaux **************/
    /** copie le fichier source dans le fichier resultat
     * retourne vrai si cela réussit
     */
    public static boolean copier( File source, File destination )
    {
            boolean resultat = false;
     
            // Declaration des flux
            java.io.FileInputStream sourceFile=null;
            java.io.FileOutputStream destinationFile=null;
     
            try {
                    // Création du fichier :
                    destination.createNewFile();
     
                    // Ouverture des flux
                    sourceFile = new java.io.FileInputStream(source);
                    destinationFile = new java.io.FileOutputStream(destination);
     
                    // Lecture par segment de 0.5Mo 
                    byte buffer[]=new byte[512*1024];
                    int nbLecture;
     
                    while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                            destinationFile.write(buffer, 0, nbLecture);
                    } 
     
                    // Copie réussie
                    resultat = true;
            } catch( java.io.FileNotFoundException f ) {
     
            } catch( java.io.IOException e ) {
     
            } finally {
                    // Quoi qu'il arrive, on ferme les flux
                    try {
                            sourceFile.close();
                    } catch(Exception e) { }
                    try {
                            destinationFile.close();
                    } catch(Exception e) { }
            } 
            return( resultat );
    }

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

    Citation Envoyé par smarties
    J'ai essayé avec le code fournis dans la FAQ ici mais ca ne marche pas.
    En même temps le titre de la question est "Comment copier ou déplacer un fichier ?"... donc c'est un peu normal que cela ne marche pas


    Pour lire le contenu d'un fichier distant via HTTP il suffit d'utiliser la classe URL et sa méthode openStream()...

    Ensuite le traitement est sensiblement le même que pour le copie...

    a++


    [edit] Grillé ! Trop lent

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 484
    Par défaut
    Citation Envoyé par broumbroum
    Eh bien les URL font l'affaire dans le cas de téléchargements je pense.
    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
     
    /** télécharger depuis ftp://www.developpez.com/ vers local*/
    String src, dst;
    src = "http://ydisanto.ftp-developpez.com/tutoriels/j2se/runtime/runtime.zip";
    dst = "file:///c:/ftp/runtime.zip";
    if(copier(new File(new URL(src)), new File(new URL(dst))))
        throw new Exception("Erreur de copie de " + src + " à " + dst + " !");
     
    /**************** source FAQ Flux et réseaux **************/
    /** copie le fichier source dans le fichier resultat
     * retourne vrai si cela réussit
     */
    public static boolean copier( File source, File destination )
    {
            boolean resultat = false;
     
            // Declaration des flux
            java.io.FileInputStream sourceFile=null;
            java.io.FileOutputStream destinationFile=null;
     
            try {
                    // Création du fichier :
                    destination.createNewFile();
     
                    // Ouverture des flux
                    sourceFile = new java.io.FileInputStream(source);
                    destinationFile = new java.io.FileOutputStream(destination);
     
                    // Lecture par segment de 0.5Mo 
                    byte buffer[]=new byte[512*1024];
                    int nbLecture;
     
                    while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                            destinationFile.write(buffer, 0, nbLecture);
                    } 
     
                    // Copie réussie
                    resultat = true;
            } catch( java.io.FileNotFoundException f ) {
     
            } catch( java.io.IOException e ) {
     
            } finally {
                    // Quoi qu'il arrive, on ferme les flux
                    try {
                            sourceFile.close();
                    } catch(Exception e) { }
                    try {
                            destinationFile.close();
                    } catch(Exception e) { }
            } 
            return( resultat );
    }
    Ca ne marche pas avec des fichiers distants

    Par contre j'ai ce bout de code :
    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
    public void download(String u, String path) {
    		java.io.FileOutputStream destinationFile=null;
    		java.io.FileInputStream sourceFile=null;
    		//String out="";
    		try {
    			URL url = new URL(u);
    			java.io.File destination=new java.io.File(path+new java.io.File(u).getName());
     
    			destination.createNewFile();
     
    			URLConnection connection = url.openConnection();
    			connection.setDoOutput(false);
    			//sourceFile=new java.io.FileInputStream(source);
    			destinationFile = new java.io.FileOutputStream(destination);
    			java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));
     
    			String line;
    			while((line = reader.readLine()) != null) {
    				destinationFile.write(line.getBytes());
    				destinationFile.write('\n');
    			}
    		} catch(java.io.IOException ioe) {
    			System.out.println("I/O Error on Navigation.download()");
    		} catch (Exception e) {} 
    		finally {
    			try {
    	            destinationFile.close();
    			} catch(Exception e) {e.printStackTrace();}
    		}
    	}
    Mais quand je télécharge une image par exemple je ne vois pas tout, pourtant le fichier fait un peu pres la meme taille que l'original

  5. #5
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    Je ne peux pas t'assurer que la méthode readline s'accompagne du retour à la ligne suivant "\n"... merci pour la correction URLConnection!
    Citation Envoyé par smarties
    (...)
    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
    //(...)
    			String line;
    			while((line = reader.readLine()) != null) {
    				destinationFile.write(line.getBytes());
    				destinationFile.write('\n');
    			}
    		} catch(java.io.IOException ioe) {
    			System.out.println("I/O Error on Navigation.download()");
    		} catch (Exception e) {} 
    		finally {
    			try {
    	            destinationFile.close();
    			} catch(Exception e) {e.printStackTrace();}
    		}
    	}
    Mais quand je télécharge une image par exemple je ne vois pas tout, pourtant le fichier fait un peu pres la meme taille que l'original

  6. #6
    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
    Les Reader/Writer sont fait pour lire des flux de caractères, c'est à dire des fichiers textes, et non pas des fichiers binaires !

    Utilises des InputStream/OutputStream et base toi sur le code de copie de fichier de la FAQ, mais en utilisant une URL en entrée...

    a++

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 484
    Par défaut
    Merci, je vais essayer.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 484
    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
    15
    16
    17
    18
    java.io.FileOutputStream destinationFile=null;
    		try {
    			URL url = new URL(u);
    			java.io.File destination=new java.io.File(path+new java.io.File(u).getName());
     
    			destination.createNewFile();
     
    			URLConnection connection = url.openConnection();
    			connection.setDoOutput(false);
    			destinationFile = new java.io.FileOutputStream(destination);
     
    			java.io.InputStream is=url.openStream();
     
    			byte[] buffer=new byte[1024];
    			while(is.read(buffer) != -1) {
    				destinationFile.write(buffer);
    			}
    		}
    Ca marche déja mieux
    mais parfois il me manque le bas d'une image ou je ne peux pas la voir

  9. #9
    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
    Ta boucle de lecture n'est pas correcte !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	byte[] buffer=new byte[1024];
    	while(is.read(buffer) != -1) {
    		destinationFile.write(buffer);
    	}
    En effet lorsque tu arrives à la fin du fichier, il y a de très forte chance qu'il y ai moins de 1024 bytes à lire. Donc le tableau ne sera modifié que partiellement ! Or write() écrit la totalité du tableau, et donc répètera une partie des informations de la lecture précédente...

    Il faut obligatoirement récupérer la valeur de retour du read() pour savoir combien de bytes ont été lu, afin d'écrire seulement ceux là. Tu peux t'inspirer du code de la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           byte buffer[]=new byte[512*1024];
           int nbLecture;
     
           while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                  destinationFile.write(buffer, 0, nbLecture);
           }

    a++

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 484
    Par défaut
    Ca marche enfin parfaitement, MERCI A TOUS de m'avoir aider.
    Ca pourrais être utile à d'autres donc je reposte le tout (le plus simple serait que ca soit dans la FAQ ) :
    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
    	public void download(String u, String path) {
    		java.io.FileOutputStream destinationFile=null;
    		try {
    			URL url = new URL(u);
    			java.io.File destination=new java.io.File(path+new java.io.File(u).getName());
     
    			destination.createNewFile();
     
    			URLConnection connection = url.openConnection();
    			connection.setDoOutput(false);
    			destinationFile = new java.io.FileOutputStream(destination);
     
    			java.io.InputStream is=url.openStream();
     
    			byte[] buffer=new byte[512*1024];
    			int reads;
     
    			while((reads=is.read(buffer)) != -1) {
    				destinationFile.write(buffer, 0, reads);
    			}
    		} catch(java.io.IOException ioe) {
    			System.out.println("I/O Error on Navigation.download()");
    		} catch (Exception e) {} 
    		finally {
    			try {
    	            destinationFile.close();
    			} catch(Exception e) {e.printStackTrace();}
    		}
    	}

  11. #11
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    Ou dans la partie contribution

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut
    Citation Envoyé par smarties
    Ca marche enfin parfaitement, MERCI A TOUS de m'avoir aider.
    Ca pourrais être utile à d'autres donc je reposte le tout (le plus simple serait que ca soit dans la FAQ ) :
    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
        public void download(String u, String path) {
            java.io.FileOutputStream destinationFile=null;
            try {
                URL url = new URL(u);
                java.io.File destination=new java.io.File(path+new java.io.File(u).getName());
     
                destination.createNewFile();
     
                URLConnection connection = url.openConnection();
                connection.setDoOutput(false);
                destinationFile = new java.io.FileOutputStream(destination);
     
                java.io.InputStream is=url.openStream();
     
                byte[] buffer=new byte[512*1024];
                int reads;
     
                while((reads=is.read(buffer)) != -1) {
                    destinationFile.write(buffer, 0, reads);
                }
            } catch(java.io.IOException ioe) {
                System.out.println("I/O Error on Navigation.download()");
            } catch (Exception e) {} 
            finally {
                try {
                    destinationFile.close();
                } catch(Exception e) {e.printStackTrace();}
            }
        }
    Est-ce que tu utilise cette fonction pour downloader des fichiers de l'internet ou de l'intranel ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/10/2014, 12h21
  2. Télécharger un fichier distant avec une URL dynamique
    Par clement106 dans le forum Langage
    Réponses: 8
    Dernier message: 30/09/2011, 17h36
  3. Télécharger, depuis le serveur, un fichier distant
    Par gamerome dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/12/2009, 14h15
  4. Télécharger fichiers distant par sftp sous XP ?
    Par eric0279 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/06/2008, 14h40
  5. Réponses: 6
    Dernier message: 25/03/2008, 22h50

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