Comment utiliser le Guichet du DownloadLink avec un fichier généré à la volée?
DownloadLink
est agréable et pratique pour la création d'un bouton/lien de téléchargement d'un fichier, le long de ces lignes:
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
et
<input type="button" wicket:id="downloadButton" value="Download" />
Cependant, je tiens à déclencher la génération du fichier à télécharger uniquement lorsque le bouton/lien est cliqué. En d'autres termes, au moment de cliquer, je voudrais appeler une méthode qui génère le fichier (un Pentaho report dans notre cas), il met dans une temp place et retourne un File
pointant vers elle. Alors je dirais le DownloadLink
à utiliser que File
. La Question est, est-ce possible en quelque sorte?
Actuellement, nous avons quelque chose comme le code ci-dessous, qui fonctionne, mais je suis intéressé de savoir si DownloadLink
pourrait être utilisé à la place.
add(new Link<Void>("downloadButton") {
@Override
public void onClick() {
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
@Override
public void write(OutputStream output) {
try {
reportService.generateReport(output, report);
} catch (IOException e) {
//...
}
}
@Override
public String getContentType() {
return CONTENT_TYPE_PDF;
}
};
getRequestCycle()
.setRequestTarget(new ResourceStreamRequestTarget(resourceStream)
.setFileName("report.pdf"));
}
});
(Guichet 1.4.18, si cela fait une différence.)
Vous devez vous connecter pour publier un commentaire.
Ne pouvez pas vous utiliser le constructeur qui prend un
Model
comme argument? Et de faire de laModel
générer laFile
dans songetObject()
. UnLoadableDetachableModel
est un bon choix, étant donné queload()
, et, par conséquent, la génération de fichiers, va être invoqué qu'une seule fois.Si le fichier est fraîchement généré à chaque fois que le lien est cliqué, l'utilisation
DownloadLink.setDeleteAfterDownload(true)
pour s'assurer que le Fichier est automatiquement supprimé une fois qu'il est servi.Je n'utilise pas la 1.4, mais le code source 1.3 montre que la
File
est récupérée par le biais degetModelObject()
dans leonClick()
méthode de laLink
.Code Source de
DownloadLink.onClick()
setModelObject()
avant d'appeler la méthode super. Xavi suggestion est beaucoup plus propre, cependant.LoadableDetachableModel
à la place.getObject()
peut être appelée plusieurs fois au cours d'une demande, maisload()
ne le ferez pas; 2. si le fichier est toujours re-généré, vous pouvez l'appelerdownloadLink.setDeleteAfterDownload(true)
, de sorte que vous n'avez pas à vous soucier de la suppression du fichier temporaire par la suite.setDeleteAfterDownload(true)
qui est exactement ce dont j'avais besoin.setCacheDuration(Duration.NONE)
sur leDownloadLink
pour forcer le navigateur à re-demande le fichier et ainsi de re-générer l'objet.&anticache=System.currentTimeMillis()
à l'URL manuellement parvenir au Guichet 1.3 (on dirait quesetCacheDuration()
a été introduit dans la version 1.5).Utiliser org.apache.wicket.balisage.html.lien.ResourceLink à la place.