DownloadLink
è bello e utile per creare un pulsante/link per il download di un file, in questo senso:Come utilizzare DownloadLink di Wicket con un file generato al volo?
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
e
<input type="button" wicket:id="downloadButton" value="Download" />
Tuttavia, vorrei grilletto la generazione del file per scaricare solo quando si fa clic sul pulsante/collegamento. In altre parole, al clic, chiamerei un metodo che genera il file (un rapporto Pentaho nel nostro caso), lo colloca in un luogo temporaneo e restituisce un File
puntandolo. Quindi direi allo DownloadLink
di usare quello File
. Domanda è, questo è possibile in qualche modo?
Attualmente abbiamo qualcosa come il seguente codice, che funziona, ma mi interessa sapere se è possibile utilizzare DownloadLink
.
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"));
}
});
(Wicket 1.4.18, se fa la differenza.)
È anche possibile eseguire l'override di onClick di DownloadLink e fare un 'setModelObject()' prima di chiamare il metodo super. Il suggerimento di Xavi è molto più pulito, però. – jbrookover
1. Utilizzare invece un 'LoadableDetachableModel'. 'getObject()' può essere chiamato più volte durante una richiesta, ma 'load()' non lo farà; 2. se il file viene sempre rigenerato, puoi chiamare 'downloadLink.setDeleteAfterDownload (true)', quindi non dovrai più preoccuparti dell'eliminazione del file temporaneo. – tetsuo
@tetsuo Grazie per i vostri preziosi commenti. Ho aggiornato la risposta con i tuoi consigli. –