DownloadLink
对于创建用于下载文件的按钮/链接非常方便,如下所示:
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
和
<input type="button" wicket:id="downloadButton" value="Download" />
但是,我希望仅在单击按钮/链接时触发文件的生成以下载。换句话说,在单击时,我将调用一个方法来生成文件(在我们的示例中是Pentaho报告),将其放在临时位置并返回指向它的File
。然后我告诉DownloadLink
用File
。问题是,这可能吗?
目前我们有类似下面的代码,它的工作,但我感兴趣的是是否可以使用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,如果有区别的话)
不能使用以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。