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 !