Télécharger fichier CSV depuis un flux [Résolu][JSF] - Java - Programmation
Marsh Posté le 07-10-2009 à 03:30:57
J'oubliais de préciser que j'utilise JSF 1.2 (Sun-RI 1.2_13) ainsi que RichFaces 3.2.2....
Marsh Posté le 07-10-2009 à 09:06:14
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...
Marsh Posté le 07-10-2009 à 03:28:59
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