¿Cómo usar el DownloadLink de Wicket con un archivo generado sobre la marcha?

DownloadLink es útil para crear un botón / enlace para descargar un archivo, en esta línea:

 add(new DownloadLink("downloadButton", getReportFile(), "report.pdf")); 

y

  

Sin embargo, me gustaría activar 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 señala. Luego le diría a DownloadLink que use ese File . La pregunta es, ¿ es esto posible de alguna manera ?

Actualmente tenemos algo así como el siguiente código, que funciona, pero estoy interesado en si se puede usar DownloadLink su lugar.

 add(new Link("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, si hace una diferencia.)

¿No puedes usar el constructor que toma un Model como argumento? Y haga que el Model genere el File en su getObject() . Un LoadableDetachableModel es una buena opción, dado que load() y, por lo tanto, la generación de archivos se invocarán solo una vez.

Si el archivo se va a generar recientemente cada vez que se hace clic en el enlace, use DownloadLink.setDeleteAfterDownload(true) para asegurarse de que el archivo se elimine automáticamente una vez que se haya publicado.

No uso 1.4, pero el código fuente en 1.3 muestra que el File se recupera mediante getModelObject() en el método onClick() del Link .

 IModel fileModel = new AbstractReadOnlyModel(){ public Object getObject() { return generateFile(); } }; DownloadLink link = new DownloadLink(linkId, fileModel, "report.pdf"); 

Código fuente de DownloadLink.onClick()

 public void onClick() { final File file = (File)getModelObject(); ... IResourceStream resourceStream = new FileResourceStream( new org.apache.wicket.util.file.File(file)); getRequestCycle().setRequestTarget(.../* uses resourceStream */...); } 

Use org.apache.wicket.markup.html.link.ResourceLink en su lugar.

Intereting Posts