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

Langage Java Discussion :

Télécharger des fichiers


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Télécharger des fichiers
    Bonjour,

    J'aimerais savoir le code pour installer un fichier depuis un URL dans un dossier choisit.
    Le dossier aura pour extension :
    - jar
    - zip

    Je souhaiterais que il n'y a pas de boucle car le fichier est lourd et que cela prendra des heures...

    Merci pour vos réponses,
    ShE3pyGame (et oui je me suis fail dans l'inscription Oo)

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord, tu ne pourras pas échapper à une boucle : soit elle sera explicitement dans ton code, soit elle sera faite dans la méthode que tu appelleras (ou dans l'une des sous-méthodes appelées par celle-ci. Mais avec un buffer on peut réduire le temps de transfert (au lieu de boucler octet par octet, on bouclera par groupe d'octets (de la taille du buffer). C'est une boucle assez classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int read = inputStream.read(buffer); read!=-1; read= inputStream.read(buffer)) {
        outputStream.write(buffer, 0, read);
    }
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final byte[] buffer = new buffer[4096];
    Ensuite, tu parles d'extensions zip ou jar : il ne s'agit donc pas de dossier, mais de fichiers. Pour écrire dans un tel fichier, tu peux utiliser un ZipOutputStream, mais si le but est d'ajouter un fichier à un zip existant, il faudra copier toutes les entries dans le ZipOutputStream ouvert sur un fichier temporaire (avec ZipInputStream ou ZipFile, pour les lire) et ajouter le nouveau fichier (voir putNextEntry()), et ensuite, supprimer le fichier d'origine et renommer le fichier temporaire avec le nom du zip d'origine. Les jars peuvent se traiter directement de la même manière, avec ZipInputStream (ou ZipFile) et ZipOutputStream (il existe des classes JarInputStream et JarOuputStream qui étendent ces clases si tu préfères).

    Pour ouvrir le inputStream, utilise la méthode openStream() de URL.

    Exemple :
    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
    public static void copyTo(URL url, Path zipPath, String path) throws IOException {
     
       final byte[] buffer = new byte[4096];
     
       final Path tmpPath = Paths.get(zipPath.getParent().toString(), zipPath.getFileName().toString() + ".tmp");
     
       try(ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(tmpPath));
           ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipPath))) {
          for(ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
             zipOutputStream.putNextEntry(zipEntry);
             for(int read = zipInputStream.read(buffer); read!=-1; read= zipInputStream.read(buffer)) {
                zipOutputStream.write(buffer, 0, read);
             }
             zipOutputStream.closeEntry();
          }
          final ZipEntry newZipEntry = new ZipEntry(path);
          zipOutputStream.putNextEntry(newZipEntry);
          try(InputStream urlStream = url.openStream()) { // attention, si le fichier distant est lui même un zip, il faudra utiliser un ZipInputStream intermédiaire
             for(int read = urlStream.read(buffer); read!=-1; read = urlStream.read(buffer)) {
                zipOutputStream.write(buffer, 0, read);
             }
          }
          zipOutputStream.closeEntry();
       }
       Files.move(tmpPath, zipPath, StandardCopyOption.REPLACE_EXISTING);
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Dans ton dernier code, je ne voit pas où est-ce qu'ont entre le lien de téléchargement. Je voit bien la variable "urlSteam" (si s'en est une), mais où la définit-ont ?

    Et merci de m'avoir répondu.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Les paramètres de la méthode :

    • URL url : l'URL de la ressource à télécharger, par exemple : URL url = new URL("http:/truc.bidule.fr/machin.png");
    • Path zipPath : le chemin du zip (ou du jar), par exemple : Path path = Paths.get("c:/truc/bidule/machin.zip");
    • String path : le nom du l'entrée dans le zip, par exemple : String path = "machin.png";
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci ! Je teste tout sa demain.
    Et juste, le Path path, c'est le dossier dans le zip/jar qui va être copier ? (Ex: Si ont met ("\data\1w27b\") il copira le sous-dossier 1w27b)

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ShEpyGame Voir le message
    Et juste, le Path path, c'est le dossier dans le zip/jar qui va être copier ? (Ex: Si ont met ("\data\1w27b\") il copira le sous-dossier 1w27b)
    C'est le nom de l'entrée (ZipEntry), donc un String, pas un Path. Et, oui, on peut gérer des sous-dossier, mais on utilise / pas \ pour séparer les parties (par ailleurs, si c'était des \, il faudrait les doubler dans la chaîne), donc data/1w27b/nomfichier.extension. Par contre, il faut ajouter une entry correspondant au dossier si on fait ça, donc "data/1w27b/" (indispensable, le / final). Pour éviter d'ajouter un dossier existant, il faudrait donc stocker les dossiers déjà existant dans le zip.

    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
    public static void copyTo(URL url, Path zipPath, String path) throws IOException {
     
       final byte[] buffer = new byte[4096];
     
       final Path tmpPath = Paths.get(zipPath.getParent().toString(), zipPath.getFileName().toString() + ".tmp");
     
       final Set<String> folders = new HashSet<>();
     
       try(ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(tmpPath));
           ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipPath))) {
          for(ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
             if  ( zipEntry.getName().endsWith("/') ) {
                  folders.add(zipEntry.getName());
             }
             zipOutputStream.putNextEntry(zipEntry);
             for(int read = zipInputStream.read(buffer); read!=-1; read= zipInputStream.read(buffer)) {
                zipOutputStream.write(buffer, 0, read);
             }
             zipOutputStream.closeEntry();
          }
          if ( path.contains("/") ) {
             final String targetFolder = path.substring(0, path.lastIndexOf("/")+1);
             if ( !folders.contains(targetFolder) ) {
                 zipOutputStream.putNextEntry(new ZipEntry(targetFolder));
                 zipOutputStream.closeEntry();
             }
          }
          final ZipEntry newZipEntry = new ZipEntry(path);
          zipOutputStream.putNextEntry(newZipEntry);
          try(InputStream urlStream = url.openStream()) { // attention, si le fichier distant est lui même un zip, il faudra utiliser un ZipInputStream intermédiaire
             for(int read = urlStream.read(buffer); read!=-1; read = urlStream.read(buffer)) {
                zipOutputStream.write(buffer, 0, read);
             }
          }
          zipOutputStream.closeEntry();
       }
       Files.move(tmpPath, zipPath, StandardCopyOption.REPLACE_EXISTING);
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci, je vais essaie de tester ce code aujourd'hui ou demain.

    P.S: À la ligne 12 de ton code tu t'est tromper t'as mit "/' du coup tout le reste est en rouge

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ShEpyGame Voir le message
    P.S: À la ligne 12 de ton code tu t'est tromper t'as mit "/' du coup tout le reste est en rouge
    Oui, faute de frappe, c'est : zipEntry.getName().endsWith("/") (double-quote au lieu de simple quote)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Télécharger des fichiers depuis une URL
    Par nicox33 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/01/2008, 18h33
  2. Impossible de télécharger des fichiers depuis mon serveur
    Par amine55555 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 12/05/2007, 14h15
  3. télécharger des fichiers de paramétrage
    Par yas2006 dans le forum JWS
    Réponses: 7
    Dernier message: 27/03/2006, 14h17
  4. Problème pour Télécharger des fichiers
    Par joce3000 dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/01/2005, 10h30

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