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 :

Accès à un fichier pdf via une URL qu'il faut que j'enregistre


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 22
    Points
    22
    Par défaut Accès à un fichier pdf via une URL qu'il faut que j'enregistre
    Bonjour,

    J'aurais besoin de votre aide svp .

    Dans une application standalone java je dois accéder à un fichier pdf via une url par exemple http://toto.com/test.pdf.
    Il faudrait que j'enregistre sur mon disque ce fichier.

    Comment faut-il procéder svp ? J'ai fait plusieurs essais mais à chaque fois je n'enregistre que 1ko et le fichier est corrompu ....

    Merci par avance pour votre aide.

    Sandrine

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Donne le code de tes essais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Points : 1 332
    Points
    1 332
    Par défaut
    Salut,

    Exemple de code tiré de mon bouquin:

    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
    import java.net.*;
    import java.io.*;
     
    public class LectureUrl {
      public static void main(String[] args) throws Exception {
        URL apache_local = new URL("http://localhost/mon_test.html");
     
        BufferedReader in = new BufferedReader(new InputStreamReader(apache_local.openStream()));
     
        String inputLine;
        while ((inputLine = in.readLine()) != null)
          System.out.println(inputLine);
          in.close();
        }
    }
    A mon avis (je permets à quiconque de me donner des coups de bâton si je me trompe): un pdf peut être lu comme un fichier texte!

    Donc, si je me trompe, après les coups de bâtons, pour me faire pardonner, il faut me donner un exemple de fichier PDF sur le Web ... et j'envoie le code qui marche: enregistrer le fichier PDF!

    C'était mon premier jour de travail "officiel" en 2009 ... et j'ai le droit de plaisanter ... je crois!
    A+

  4. #4
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    1. Une volée de bois vert.
    2. Essaie donc d'ouvrir un fichier PDF avec notepad pour contrôler qu'un fichier au format PDF peu être lu comme du texte.
    3. Ouvre directement sur une ressource PDF.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      URL apache_local = new URL("http://localhost/mon_test.pdf");
    4. Utilise la balise [ CODE ] pour ton code
    Bien le bonjour chez vous
    Jowo

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String urlP = "http://toto.fr/cgi-bin/exterieurs/index.php?action=getpdf&num="+code;
    URL url = new URL(urlP);
    BufferedReader in = new BufferedReader(	new InputStreamReader(url.openStream()));
     
    String inputLine;
    File f=new File("D:\\Demande"+code+".pdf");				   
    OutputStream out=new FileOutputStream(f);
     
    while ((inputLine = in.readLine()) != null)
    	out.write(inputLine.getBytes());
    in.close();
    out.close();
    Cela me créé bien mon fichier mais son contenu est vide juste 1Ko...

    Sandrine

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Un fichier PDF n'est pas un fichier texte.
    De manière générale, il ne faut pas utiliser une méthode qui gère des chaines de caractères pour récupérer un fichier. La méthode "readLine" de BufferedReader n'est pas adaptée pour télécharger un fichier binaire.
    A la place, utilise un BufferedInputStream et sa méthode "read" qui remplie un tableau de byte : la technique reste générique au lieu d'être spécifique à un type particulier de fichier.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    J'ai modifié mon code de cette façon :

    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 urlP = "http://toto.fr/cgi-bin/exterieurs/index.php?action=getpdf&num="+code;
    URL url = new URL(urlP);
    InputStream ins = url.openStream();
     
    BufferedInputStream  in = new BufferedInputStream (url.openStream());
     
    int input;
    File f=new File("D:\\Demande"+code+".pdf");				   
    OutputStream out=new FileOutputStream(f);
     
    while ((input = in.read()) != -1)
    	out.write(input);
    in.close();
    out.close();
    et j'obtiens toujours le même résultat...

    Sandrine

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    La condition d'arrêt de ta boucle "((input = in.read()) != -1)" est trop restrictive.
    A la place, il faut soit lire l'entête HTTP pour connaitre la taille de la ressource distante, soit faire plusieurs essais séparés par des pauses avant de considérer que le transfert est terminé. Et il faut aussi lire un tableau au lieu d'un seul byte à la fois.
    Par 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
     
    int essai = 0;
    byte[] tabLire = new byte[ 4096 ];
    int taille = 0;
     
    while( essai < 10 )
    {
      taille = in.read( tabLire );
      if( taille <= 0 )
      {
        ++essai;
        try { Thread.sleep( 200 ); }
        catch( InterruptedException exc ) {}
      }
      else
      {
        out.write( tabLire, 0, taille );
        essai = 0;
      }
    }
    Il reste à trouver un bon compromis pour le nombre max de rééssais et la pause.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Je me demande où sont passées les exceptions?

    Dans ton exemple de code, je ne vois aucun traitement des exceptions IOException, FileNotFoundException et MalformedURLException.

    Es-tu sûre que ton URL est directe (pas de redirection) et qu'elle pointe sur une ressource existante?

    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
    54
    55
    56
    57
    58
    59
    60
    61
     
    public static void main(String s[]) {
      String code = "0"; 
      final String urlP = "http://toto.fr/cgi-bin/exterieurs/index.php?action=getpdf&num="+code;
      URL url = null;
      try {
        url = new URL(urlP);
      }
      catch (MalformedURLException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
      }
      if (url == null) {
        return;
      }
     
      BufferedInputStream  in = null;
      try {
        in = new BufferedInputStream (url.openStream());
      }
      catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      if (in == null) {
        return;
      }
     
      final File f = new File("D:\\Demande"+code+".pdf");				   
      OutputStream out = null;
      try {
        out = new FileOutputStream(f);
      }
      catch (FileNotFoundException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
      }
      finally {
        if (out == null) {
          closeStream(in);
          return;
        }
      }
     
      final int BUFF_LEN = 4096;
      final byte[] buffer = new byte[BUFF_LEN]; 
      int read;
      try {
        while ((read = in.read(buffer, 0, BUFF_LEN)) != -1) {
          out.write(buffer, 0, read);
        }
      }
      catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      finally {
        closeStream(in);
        closeStream(out);
      }
    }
    Bien le bonjour chez vous
    Jowo

  10. #10
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Points : 1 332
    Points
    1 332
    Par défaut
    Il faut donner l'URL exact!

    Par exemple:
    http://toto.fr/cgi-bin/exterieurs/in...n=getpdf&num=1
    ne marche pas!

    Il y a de la redirection, du streaming ou autre.
    C'est clair ... j'ai pas eu le temps aujourd'hui ... des readline() ne marcheront pas, et il faudra peut-être traiter le protocole.

Discussions similaires

  1. Fermer un FICHIER pdf via une macro
    Par fusee2013 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/07/2013, 12h16
  2. Envoi de fichier en POST via une URL vers une page php
    Par Supersonik dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 21/07/2011, 16h47
  3. [PHP 5.0] Upload automatique d'un fichier via une url Php
    Par davelop dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2010, 12h07
  4. Recuperer un fichier via une URL
    Par kululu dans le forum Général Java
    Réponses: 6
    Dernier message: 12/05/2010, 15h25
  5. Accéder au contenu d'un fichier via une URL en mode binaire
    Par sbelli dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/10/2005, 10h25

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