Téléchargement depuis URL en Java

Résolu
Bonjour,

J'ai un problème lors des téléchargements à partir d'un URL, mon fichier téléchargé reste à 0ko donc inutilisable. Voici le code (de KX ) :

public static void download(URL src, File dest) throws IOException {
try (PrintWriter out = new PrintWriter(dest);
Scanner in = new Scanner(src.openStream())) {
while (in.hasNextLine())
out.println(in.nextLine());
}
}


puis lorsque je lance :
download(new URL("[URL du téléchargement]"), new File("[destination fichier]"));


Merci !
:D

3 réponses

  1. Modérateur
    Bonjour,

    1) Est-ce que le programme se termine ou il reste bloqué ?
    2) Il y a une exception ? Laquelle ?
    3) Quel est le protocole utilisé dans ton URL ?
    4) Si tu te connectes en manuel est-ce que l'on te demande de t'identifier ?
    1. Ce que j'ai fais est un peu particulier, j'ai crée un projet java ou je test juste (puis je met le code dans mon autre projet) voici ma classe:

      import java.io.File;
      import java.io.IOException;
      import java.io.PrintWriter;
      import java.net.URL;
      import java.util.Scanner;

      public class Test {

      public static void main(String[] args) {
      try {
      download(new URL("http://exemple.com/exemple/download/exemple.exe"), new File("C:\\Users\\Bureau2\\AppData\\Roaming\\exemple.exe"));
      } catch (Exception e) {}
      }

      public static void download(URL src, File dest) throws IOException {
      try (PrintWriter out = new PrintWriter(dest);
      Scanner in = new Scanner(src.openStream())) {
      while (in.hasNextLine())
      out.println(in.nextLine());
      }
      }

      }
      1. Le protocole est http et on ne me demande pas de m'identifier.
      2. Modérateur
        Le problème c'est que tu as fait
        catch (Exception e)  {}
        donc en cas d'erreur elle est complètement cachée et impossible de savoir quel est le problème.

        Fait plutôt :

        public static void main(String[] args) throws Exception  {
        	download(new URL(...), new File(...));
        }
      3. Voila les erreurs :

        Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: http://exemple.fr/capt/download/exemple.exe
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
        at java.net.URL.openStream(Unknown Source)
        at Test.download(Test.java:21)
        at Test.main(Test.java:15)
      4. Modérateur
        Erreur 403, c'est accès refusé, tu n'as pas le droit d'accéder à ce fichier.
        https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
      5. Sauf que le fichier est sur mon serveur :/
    2. Bon et bien je suis passé par NIO et tout marche si ça peux aider quelqu'un voici les codes :

      private static void download(String urlStr, String file) throws IOException {
      URL url = new URL(urlStr);
      ReadableByteChannel rbc = Channels.newChannel(url.openStream());
      FileOutputStream fos = new FileOutputStream(file);
      fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
      fos.close();
      rbc.close();
      }


      puis pour download :

      try  {
      download("URL DU TELECHARGEMENT", "LIEU DU DOWNLOAD");
      } catch(Exception e) {}


      Merci pour vos réponses rapides :)
      1. Modérateur
        Tu étais toujours avec le code avec le Scanner ? En effet cela ne s'applique qu'aux fichiers textes (tu avais piqué ce code dans une discussion qui concernait un fichier HTML). Mais comme tu as un fichier .exe ça casse...

        Remarque : on peut simplifier ton code et le sécuriser car tu as des problèmes avec la fermeture des fichiers en cas d'erreur.

        public static void download(URL src, Path dest) throws IOException {
            try (InputStream in = src.openStream()) {
                Files.copy(in, dest, StandardCopyOption.REPLACE_EXISTING);
            }
        }

        download(new URL("http://www.google.fr"), Paths.get("C:/google.html"));