DownloadLink
是創建一個按鈕/鏈接下載文件很好的和方便的,沿着這些線路:如何使用Wicket的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"));
}
});
(檢票1.4.18,如果它的確與衆不同。)
您也可以覆蓋DownloadLink的onclick和()'調用父類方法之前做了'setModelObject。不過,哈維的建議更清晰。 – jbrookover
1.使用'LoadableDetachableModel'代替。 'getObject()'可能在請求期間被多次調用,但'load()'不會; 2.如果文件總是被重新生成,你可以調用'downloadLink.setDeleteAfterDownload(true)',這樣你就不用擔心之後刪除臨時文件了。 – tetsuo
@tetsuo感謝您的寶貴意見。我已經用你的建議更新了答案。 –