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

Spring Web Java Discussion :

[Spring MVC] Envoyer un document à l'utilisateur.


Sujet :

Spring Web Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut [Spring MVC] Envoyer un document à l'utilisateur.
    Bonjour à tous,


    Bon, je ne sais pas trop où poster ça, donc je le fais ici.


    J'ai un projet Spring/JDBC. Sur une page, on affiche un joli tableau contenant des infos et un lien.

    Lorsque qu'on clique sur un lien, on doit récupérer un document.

    Pour le moment, lors du clique, je récupère l'id de la ligne en question, et avec ça, je récupère un OutputStream contenant le document.

    Comment faire pour renvoyer ce document à l'utilisateur?


    Merci,

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Tu es dans quel contexte ?

    une application standalone un une application web?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    Je suis dans une application Web

  4. #4
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Quand tu dis que tu récupere un OutputStream contenant le document, ne veux tu pas dire un InputStream ?

    Car l'OutputStream permet d'écrire dans un document, pas le lire ...



    Si c'est bien un InputStream que tu récupere tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    // response est ton objet HttpServletResponse
    OutputStream out = response.getOutputStream();
     
    // inp est ton InputStream
     
    CopyUtils.copy(in, out);

    CopyUtils est dans Commons IO, mais si tu ne veux pas inclure la librairie, voici le code de la méthode copy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static int copy(
                InputStream input,
                OutputStream output)
                    throws IOException {
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int count = 0;
            int n = 0;
            while (-1 != (n = input.read(buffer))) {
                output.write(buffer, 0, n);
                count += n;
            }
            return count;
        }
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    Je récupère bien un outputStream, donc je pense qu'avant de faire quoi que ce soit, je dois utiliser transposer mon outputStream en InputStream (via des Pipes peut etre).

    Le problème maintenant, c'est que je n'ai pas accès a HttpServletResponse. Eclipse me propose HttpServletBean à la place.

    Comment procéder dans ce cas?

  6. #6
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Montre ton code
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    Voilà ma classe en question.


    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    import javax.faces.model.ListDataModel;
     
    import com.projet.common.exceptions.BusinessException;
    import com.projet.editique.domain.Evenement;
    import com.projet.editique.extractRsd.PdfExtracor;
    import com.projet.apiFolders.FLDException;
     
    public class EvenementDataList {
     
    	List liste;
    	ListDataModel result = new ListDataModel();
    	Evenement curentEvt;
     
     
    	public void doLoadEvt() throws BusinessException, IOException {
     
    		final Evenement evt = (Evenement) getResult().getRowData();
    		FileOutputStream tempOut;
    		setCurentEvt(evt);	
     
     
    	        System.out.println(evt.getDocId());
    		try {
    			PdfExtracor pdf = new PdfExtracor("log","pass","192.168.1.1",26000);
    			pdf.connect();
    			tempOut=(FileOutputStream) pdf.extract(evt.getDocId());
    		}
    		catch (FLDException hop) {
    			System.out.println("Extraction pdf echouée - Erreur : " + hop);
    			throw new BusinessException("Extraction pdf échoué, le document n'existe pas.");			
    		}
     
     
     
    	}
     
    	/**
             * 
             * @return List
             */
    	public List getListe() {
    		return liste;
    	}
     
    	/**
             * 
             * @param liste
             */
    	public void setListe(List liste) {
    		this.liste = liste;
    	}
     
    	/**
             * 
             * @return ListDataModel
             */
    	public ListDataModel getResult() {
    		result.setWrappedData(liste);
    		return result;
    	}
     
    	/**
             * 
             * @param result
             */
    	public void setResult(ListDataModel result) {
    		this.result = result;
    	}
    	/**
             * 
             *
             * @return
             */
    	public Evenement getCurentEvt() {
    		return curentEvt;
    	}
    /**
     * 
     * @param curentEvt
     */
    	public void setCurentEvt(Evenement curentEvt) {
    		this.curentEvt = curentEvt;
    	}
     
     
     
     
    }

  8. #8
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Edite ton post précedent et met ton code entre des balises CODE, on verra mieux


    PdfExtractor ca vient de quel librairie ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    PdfExtrator est une classe "maison" qui va chercher le pdf dans une base spécial.

  10. #10
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Soit votre classe n'est pas faite pour "lire" un document soit tu l'utilise mal.

    Si tu veux "lire" un document ( ou n'importe quoi ), il faut un InputStream.
    La apparement tu "caste" en FileOutputStream, tu es sur de ton coup ?

    Car avec un FileOutputStream, tu ne peux qu'écrire dans un fichier ...
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    La classe écrit le pdf dans l'OutputStream.

    Je dois donc, en effet, récupéré cet output et le "transformé" en input. C'est pour cela que je me demandais si l'utilisation d'un Pipe n'était pas plus mal.

    Mais une fois ce problème résolé, comment faire pour renvoyé ce stream au client?

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 38
    Points
    38
    Par défaut
    J'ai une autre solution:

    Mon pdf est extrait sur le serveur, à un endroit connu du server.

    Comment redigirer le client sur l'url de ce pdf?

    Merci,

  13. #13
    Membre averti Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Points : 300
    Points
    300
    Par défaut
    Tu dis que tu n'as pas accès au HttpServletResponse...
    Or, cet objet est l'objet à utiliser pour retourner une réponse (une page HTML, un document PDF, ...) à tes utilisateurs !

    En fait, la démarche à adopter pour résoudre ton problème est la suivante.
    Premièrement, tu dois placer ton code dans un controlleur Spring (ou dans une simple servlet, si tu n'utilises pas Spring MVC). Tu aura ainsi accès au HttpServletResponse.
    Deuxièmement, tu dois récupérer un InputStream sur ton fichier PDF (ça, je pense que tu le fais déjà).
    Troisièmement, tu dois copier ton InputStream dans l'OutputStream de ta HttpServletResponse (comme te l'a expliqué Hikage avec sa fonction copy).
    Quatrièmement, tu dois écrire l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //response est ta HttpServletResponse
    response.setContentType("application/pdf");
    Enfin, si tu utilises un controlleur Spring, tu dois écrire l'instruction suivante :
    Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.
    Confucius

Discussions similaires

  1. récupérer un document Spring mvc
    Par santati dans le forum Spring Web
    Réponses: 0
    Dernier message: 04/03/2009, 13h50
  2. envoye de document entre les differents utilisateurs
    Par t.n.b.g dans le forum WinDev
    Réponses: 4
    Dernier message: 25/05/2008, 09h38
  3. [Spring MVC][Validator] Ne stop pas si il y a une erreurs
    Par Hikage dans le forum Spring Web
    Réponses: 3
    Dernier message: 15/02/2006, 09h43
  4. [Débat] Spring MVC versus Struts
    Par alheim dans le forum Frameworks Web
    Réponses: 6
    Dernier message: 19/12/2005, 10h13
  5. [Spring MVC] Formulaire dynamique
    Par partyboy dans le forum Spring Web
    Réponses: 7
    Dernier message: 17/10/2005, 10h52

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