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. 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"));
  2. 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 :/
  3. 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 ?