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

JSF Java Discussion :

Télécharger fichier CSV depuis un flux


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut Télécharger fichier CSV depuis un flux
    Bonjour,

    J'ai un soucis dans mon SI avec la fonctionnalité d'export de données sous le format CSV.

    Si je génère un fichier et que je fais un redirect comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.getExternalContext().redirect(location+filename);
    J'obtiens alors bien le comportement désiré : une boite de dialogue s'ouvre avec la demande de téléchargement.

    Cependant, cette solution ne me convient pas car je ne devrais pas avoir à passer par un fichier (avec notamment des pbs de libération, de concurrences...) car mes données en CSV sont générés suivant la demande.

    J'ai donc mis en place une solution qui passe uniquement par les flux d'entrées/sorties et j'écris sur le flux de la réponse HTTP comme ci-dessous :
    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
    ByteArrayOutputStream outputCsv = new ByteArrayOutputStream();
    			// si résultats, les écrit en Csv dans le flux
    			if (getModele() != null && getModele().getResultReq() != null) {
    				outputCsv = generator.writeCSV(getModele().getResultReq().toStringArrays(), true);
    			}
     
    			// renvoie le flux du fichier CSV comme réponse
    			FacesContext context = FacesContext.getCurrentInstance();
    			HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
    			response.reset();
     
    			// écrit le header de la réponse
    			response.setHeader("Content-Disposition", "attachment; filename=\"" + NOM_FICHIER_CSV +"\"");
    			response.setContentType("text/csv");
    			response.setContentLength(outputCsv.size());
    			response.setCharacterEncoding("UTF-8");  
     
    			// écrit le contenu de la réponse
    			response.getOutputStream().write(outputCsv.toByteArray());
    			response.getOutputStream().flush();
    			response.getOutputStream().close();
     
    			outputCsv.close();
     
    			context.responseComplete();
     
    			return null;
    Cette solution est proposée dans de nombreux forum et semble bien fonctionnée.
    Seulement dans mon cas (testé principalement avec Firefox),
    le fichier CSV est directement affiché dans le navigateur. En plus, si j'essaye de contourner ce problème en faisant "Ficher/Enregistrer sous...", le fichier qui s'enregistre n'est pas celui là, mais celui qui est affiché dans l'adresse du navigateur, c'est à dire l'ancienne page .faces (ou tout du moins son code html) !

    Normalement, en effectuant le "setContentType" sur ma "response" (j'ai essayé pleins de content-type différents), mon navigateur devrait bien reconnaitre que c'est un fichier à enregistrer ?!!!

    Si je regarde plus précisément ce qui se passe avec Firebug, j'obtiens comme header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Response Headers
    Server	Apache-Coyote/1.1
    Content-Disposition	attachment; filename="fisheye_export.csv"
    Content-Type	text/csv
    Transfer-Encoding	chunked
    Date	Wed, 07 Oct 2009 01:11:09 GMT
    (en passant tranfert-encoding ne passe pas ? que signifie "chunked"?)
    et comme response :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "jeu_donnees";"num_transect";"num_station";"date";"lieu_dit";.......
    Bref, le contenu de mon fichier cvs brute !

    On peut également apercevoir dans la partie "Post" de firebug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AJAXREQUEST	j_id_jsp_969069486_0
    j_id_jsp_969069486_49	j_id_jsp_969069486_49
    j_id_jsp_969069486_49:j_id_jsp_969069486_55	j_id_jsp_969069486_49:j_id_jsp_969069486_55
    javax.faces.ViewState	j_id5
    Serait-ce cette partie qui pause problème au navigateur ?


    Bref, toute aide sera la bienvenue de votre part...

    Merci !

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut composants J2EE principaux utilisés
    J'oubliais de préciser que j'utilise JSF 1.2 (Sun-RI 1.2_13) ainsi que RichFaces 3.2.2....

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Comment tu lancer le téléchargement dans la JSP?

    Si tu utilise un button ou un lien Ajax ça ne marchera pas, utilise un simple commandButton.

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut
    Pourquoi faire simple quand on on peut faire compliquer ???

    En effet, j'avais bien un <a4j:commandLink> au lieu d'un <h:commandLink> !!!
    Je ne sais pas pourquoi j'avais il y avait ce résidu de a4j:commandLink...
    Cela explique bien l'AJAX REQUEST qu'on pouvait apercevoir avec firebug.

    La réponse était dans la question...
    Un grand merci pour m'avoir enlever ces oeillères !

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    N'oublie pas la prochaine fois

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Par défaut
    oupsssss

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/05/2009, 14h53
  2. [CSV] Enregistrer un fichier CSV depuis un site
    Par -Neo- dans le forum Langage
    Réponses: 4
    Dernier message: 19/09/2008, 23h04
  3. Réponses: 2
    Dernier message: 16/07/2008, 22h32
  4. Changer le séparateur d'un fichier csv depuis VB5
    Par manue22 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 09/11/2007, 09h29
  5. [CSV] Créer un fichier csv depuis php
    Par jbidou88 dans le forum Langage
    Réponses: 5
    Dernier message: 07/05/2007, 17h41

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