DownloadLink
es agradable y práctico para la creación de un botón/enlace para descargar un archivo, a lo largo de estas líneas:¿Cómo utilizar el DownloadLink de Wicket con un archivo generado sobre la marcha?
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
y
<input type="button" wicket:id="downloadButton" value="Download" />
Sin embargo, me gustaría gatillo de la generación del archivo para descargar solo cuando se hace clic en el botón/enlace. En otras palabras, al hacer clic, llamaría a un método que genera el archivo (un informe de Pentaho en nuestro caso), lo coloca en un lugar temporal y devuelve un File
apuntando a él. Luego le diría al DownloadLink
que use ese File
. La pregunta es, ¿Es esto posible de alguna manera?
Actualmente tenemos algo así como el código siguiente, que funciona, pero estoy interesado en si podría usarse DownloadLink
en su lugar.
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"));
}
});
(1.4.18 Wicket, si se hace una diferencia.)
También puede anular el onClick de DownloadLink y hacer un 'setModelObject()' antes de llamar al método super. La sugerencia de Xavi es mucho más limpia, sin embargo. – jbrookover
1. Use un 'LoadableDetachableModel' en su lugar. 'getObject()' puede llamarse varias veces durante una solicitud, pero 'load()' no; 2. Si el archivo siempre se vuelve a generar, puede llamar a 'downloadLink.setDeleteAfterDownload (true)', por lo que no tendrá que preocuparse por eliminar el archivo temporal después. – tetsuo
@tetsuo Gracias por sus valiosos comentarios. He actualizado la respuesta con tus recomendaciones. –