À l'aide d'un bouton de commande dans une Page jsf pour télécharger un fichier
À l'aide d'un bouton de commande dans une Page jsf pour télécharger un fichier. Aide: JSF & Richfaces.
J'ai une table (s'étend ExtendedDataModel implémente Modifiables, Serializable), avec quelques données et dans chaque ligne d'un bouton "télécharger".
<a4j:commandButton id="getDownload" value="download"
style="margin-left:10px;margin-right:10px;width:100px;"
action="#{controller.download}" immediate="true" ajaxSingle="true">
<f:setPropertyActionListener target="#{controller.idString}" value="#{item.id}" />
</a4j:commandButton>
Je créer le fichier dans le contrôleur:
public void download(){
OutputStream out = null;
....
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
out = response.getOutputStream();
ZipOutputStream zipout = new ZipOutputStream(out);
.....
zipout.close();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");
out.flush();
....
} finally {
try {
if (out!=null){
out.close();
}
FacesContext.getCurrentInstance().responseComplete();
} catch (IOException e) {
logger.error(e);
}
}
...
}
Le Problème a commencé, quand j'ai mis en place le ExtendedDataModel mon auto.
Au début, j'ai utilisé h:commandLink, mais la méthode de contrôleur n'a jamais été appelé... j'ai essayé et essayé... maintenant, la bonne méthode est appelée, mais les (zip) contenu du fichier est affiché dans la page. Je veux un bouton/lien sur la page, l'utilisateur peut cliquer pour télécharger le fichier. La page elle-même ne devrait pas changer. Des idées?
Je peux créer une servlet, mais je ne comprends pas pourquoi le ExtendedDataModel changé le comportement des liens à l'intérieur.
Edit1
J'ai utilisé
<h:commandLink id="getDownload" value="download" action="#{controller.download}">
<f:setPropertyActionListener target="#{controller.idString}" value="#{item.id}" />
</h:commandLink>
avant. Il fonctionne avec la "normale" richfaces table, mais pas quand je l'ai utilisé à l'intérieur de mon propre tableau qui s'étend ExtendedDataModel.
Edit 2 - Solution/Solution De Contournement
Il est impossible d'utiliser le h:commandButton, .. Lien... que ce soit à l'intérieur de l'auto fait de la table, pour télécharger un fichier. Je suis maintenant à l'aide d'un bouton dans le tableau de rendre une nouvelle PanelGroup et un deuxième bouton à l'intérieur de la nouvelle PanelGroupt à télécharger le fichier.
J'ai googlé beaucoup pour cette, ressemble à un riche visages bug.
OriginalL'auteur M.R. | 2010-12-02
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas télécharger un fichier par une requête ajax. Remplacer
a4j:commandButton
parh:commandButton
.Mise à jour que par votre question de mise à jour: pour obtenir des liens de la commande/boutons à l'intérieur d'un
UIData
composant comme<h:dataTable>
,<rich:dataTable>
, etc pour travailler, vous devez vous assurer que le haricot, qui est le modèle de données (tout ce qui est derrière levalue
attribut de laUIData
composant) est de préserver exactement le même modèle de données lors de la demande du formulaire de soumission. Si vous voulez garder votre bean la portée de la requête, puis la façon la plus simple est de faire référence au bean dans un<a4j:keepAlive>
tag.Vous avez vraiment besoin de feu synchrone demande. JavaScript ne peut pas gérer le binaire réponse correctement car il ne dispose pas d'installations pour forcer un Enregistrer sous dialogue ou écrire sur le disque local en raison de restrictions de sécurité. Essayez de définir
ajaxSingle="false"
dans lea4j:commandButton
(cependant, je ne pense pas que cela fonctionne correctement). Je ne fais pas de RichFaces, mais une recherche sur Google ce problème apprend-moi que vous n'êtes pas le seul qui est aux prises avec ce problème. Lea4j:htmlCommandLink
a également été suggéré qu'une solution, lui donner un essai.OriginalL'auteur BalusC
OriginalL'auteur mahmut