如何使用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()
生成File
。 LoadableDetachableModel
是一个不错的选择,因为load()
和文件生成只会被调用一次。
如果要在每次单击链接时新生成文件,请使用DownloadLink.setDeleteAfterDownload(true)
以确保文件在提供后自动删除。
我不使用1.4,但1.3中的源代码显示File
通过Link
的onClick()
方法中的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。