web-dev-qa-db-ja.com

その場で生成されたファイルでWicketのDownloadLinkを使用するにはどうすればよいですか?

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)

18
Jonik

Modelを引数として取るコンストラクターを使用できませんか?そして、ModelがそのgetObject()Fileを生成するようにします。 load()、つまりファイル生成が1回だけ呼び出されることを考えると、LoadableDetachableModelは適切な選択です。

リンクがクリックされるたびにファイルが新たに生成される場合は、 DownloadLink.setDeleteAfterDownload(true) を使用して、ファイルが提供されると自動的に削除されるようにします。

1.4は使用していませんが、1.3のソースコードは、FilegetModelObject()メソッドで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 */...);
}
15
Xavi López

代わりにorg.Apache.wicket.markup.html.link.ResourceLinkを使用してください。

11
martin-g