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 :
J'obtiens alors bien le comportement désiré : une boite de dialogue s'ouvre avec la demande de téléchargement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part context.getExternalContext().redirect(location+filename);
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 :
Cette solution est proposée dans de nombreux forum et semble bien fonctionnée.
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;
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 :
(en passant tranfert-encoding ne passe pas ? que signifie "chunked"?)
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
et comme response :
Bref, le contenu de mon fichier cvs brute !
Code : Sélectionner tout - Visualiser dans une fenêtre à part "jeu_donnees";"num_transect";"num_station";"date";"lieu_dit";.......
On peut également apercevoir dans la partie "Post" de firebug :
Serait-ce cette partie qui pause problème au navigateur ?
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
Bref, toute aide sera la bienvenue de votre part...
Merci !
Partager