Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1079 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Résolu][JSF]Télécharger fichier CSV depuis un flux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu][JSF]Télécharger fichier CSV depuis un flux

n°1929576
dawapower
Posté le 07-10-2009 à 03:28:59  profilanswer
 

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 :

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 :

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 :

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 :

"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 :

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 !


Message édité par dawapower le 07-10-2009 à 09:17:39
mood
Publicité
Posté le 07-10-2009 à 03:28:59  profilanswer
 

n°1929577
dawapower
Posté le 07-10-2009 à 03:30:57  profilanswer
 

J'oubliais de préciser que j'utilise JSF 1.2 (Sun-RI 1.2_13) ainsi que RichFaces 3.2.2....

n°1929603
dawapower
Posté le 07-10-2009 à 09:06:14  profilanswer
 

Pourquoi faire simple quand on on peut faire compliquer ???
 
J'avais un <a4j:commandLink> au lieu d'un <h:commandLink> !!!  
Je ne sais pas pourquoi 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...  :/


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Résolu][JSF]Télécharger fichier CSV depuis un flux

 

Sujets relatifs
[résolu] strtr renvoie des caractères farfelus (UTF-8)[resolu]Jquery, slider bug sur IE
[VBS] Sélectionner un fichier au hasard et le copier (SVP)insertion image dans fichier excel
[Résolu] - [XSL] problème avec un xls:for-each[résolu] 1 applet insérée 2 fois dont seule la première marche
[Résolu]Prog java ecoute même quand pas focus dans Windows[Résolu] Choix d'un schéma d'une table
Insérer des données dans un fichier PDF avec PHPnom du fichier et encodage d'url...
Plus de sujets relatifs à : [Résolu][JSF]Télécharger fichier CSV depuis un flux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR