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
を生成するようにします。 load()
、つまりファイル生成が1回だけ呼び出されることを考えると、LoadableDetachableModel
は適切な選択です。
リンクがクリックされるたびにファイルが新たに生成される場合は、 DownloadLink.setDeleteAfterDownload(true)
を使用して、ファイルが提供されると自動的に削除されるようにします。
1.4は使用していませんが、1.3のソースコードは、File
のgetModelObject()
メソッドでonClick()
を使用して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 */...);
}
代わりにorg.Apache.wicket.markup.html.link.ResourceLinkを使用してください。