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![]()
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![]()
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 ); }
Salut,
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 pasEnvoyé par smarties
![]()
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![]()
Ca ne marche pas avec des fichiers distantsEnvoyé par broumbroum
![]()
Par contre j'ai ce bout de code :
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
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();} } }![]()
Je ne peux pas t'assurer que la méthode readline s'accompagne du retour à la ligne suivant "\n"...merci pour la correction URLConnection!
Envoyé par smarties
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++
Ca marche déja mieux
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); } }![]()
mais parfois il me manque le bas d'une image ou je ne peux pas la voir![]()
Ta boucle de lecture n'est pas correcte !
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...
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); }
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++
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 ?Envoyé par smarties
Partager