如何使用Wicket的DownloadLink与动态生成的文件?

DownloadLink非常适合创建用于下载文件的按钮/链接,方法如下:

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

  

但是,我想只在单击按钮/链接时触发生成文件才能下载 。 换句话说,点击后,我会调用一个生成文件的方法(在我们的例子中是Pentaho报告),将它放在临时位置并返回指向它的File 。 然后我告诉DownloadLink使用该File 。 问题是, 这可能以某种方式吗?

目前我们有类似下面的代码,它可以工作,但我对是否可以使用DownloadLink感兴趣。

 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,如果它有所作为。)

你不能使用以Model作为参数的构造函数吗? 并使Model在其getObject()生成FileLoadableDetachableModel是一个不错的选择,因为load()和文件生成只会被调用一次。

如果要在每次单击链接时新生成文件,请使用DownloadLink.setDeleteAfterDownload(true)以确保文件在提供后自动删除。

我不使用1.4,但1.3中的源代码显示File通过LinkonClick()方法中的getModelObject()检索。

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

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 */...); } 

请改用org.apache.wicket.markup.html.link.ResourceLink。