gpt4 book ai didi

java - 如何将 Wicket 的 DownloadLink 与动态生成的文件一起使用?

转载 作者:太空狗 更新时间:2023-10-29 22:33:33 24 4
gpt4 key购买 nike

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() 中生成 FileLoadableDetachableModel 是一个不错的选择,因为 load() 以及文件生成只会被调用一次。

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

我没有使用1.4,但是1.3中的源代码显示File是通过onClick()中的getModelObject()获取的 Link 的方法。

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

关于java - 如何将 Wicket 的 DownloadLink 与动态生成的文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7646270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com