lundi 11 février 2008

Télécharger un fichier via JSF

Question du jour: comment renvoyer un fichier (généré à la volée ou du disque) au navigateur web à partir d'un back bean JSF?

Prendre un FacesContext, extraire l'objet response de son external context. Faire revenir la response en la castant en HttpServletResponse. Ajouter quelques headers http (pour le nom du fichier), un type mime (pour le comportement du navigateur). Ajoutez un flux quelconque (généré à la volée ou lue a partir d'un fichier selon les goûts), et retirez immédiatement (responseComplete) pour éviter les ennuis.
Compilez, déployez et savourez ...

En mode intelligible ça donne ceci :

public void doTestStream(ActionEvent ae) throws IOException
{
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ec = context.getExternalContext();
HttpServletResponse response = (HttpServletResponse) ec.getResponse();
response.reset();
response.setContentType("application/csv");
response.setHeader("Content-Disposition", "filename=Demo.csv");
response.setHeader("Content-Transfer-Encoding", "binary");
ServletOutputStream sop = response.getOutputStream();
sop.write("hello;csv;world".getBytes());
sop.flush();
context.responseComplete();
}

2 commentaires:

Sso a dit…

salut
une question pourquoi ta mis cette méthode void ..avec un ActionEvent

pour l'appeler avec un actionListener

si oui peut on invoker cette méthode avec un simple action ??

Jocelyn Demoy a dit…

Je pense que tu dois pouvoir utiliser une simple action de backbean.