DownloadLink https://ci.apache.org/projects/wicket/apidocs/1.4.x/org/apache/wicket/markup/html/link/DownloadLink.html创建用于下载文件的按钮/链接非常方便,如下所示:
add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));
and
<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,如果有影响的话。)
你不能使用带有 a 的构造函数吗Model
作为论点?并使Model
生成File
in its getObject()
. A LoadableDetachableModel
是一个不错的选择,因为load()
,因此文件生成将仅被调用一次。
如果每次单击链接时都要重新生成文件,请使用DownloadLink.setDeleteAfterDownload(true) http://wicket.apache.org/apidocs/1.4/org/apache/wicket/markup/html/link/DownloadLink.html#setDeleteAfterDownload(boolean)以确保文件在送达后自动删除。
我不使用1.4,但1.3中的源代码显示File
是通过以下方式检索的getModelObject()
in the onClick()
的方法Link
.
IModel fileModel = new AbstractReadOnlyModel(){
public Object getObject() {
return generateFile();
}
};
DownloadLink link = new DownloadLink(linkId, fileModel, "report.pdf");
的源代码DownloadLink.onClick() http://wicket.apache.org/apidocs/1.4/org/apache/wicket/markup/html/link/DownloadLink.html#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 */...);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)