如何使用Wicket的DownloadLink与动态生成的文件?

时间:2011-10-04 10:08:49

标签: java download 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"));
  }
});

(Wicket 1.4.18,如果它有所作为。)

2 个答案:

答案 0 :(得分:15)

你不能使用以Model为参数的构造函数吗?并使Model在其File中生成getObject()。鉴于LoadableDetachableModelload()是一个不错的选择,因此文件生成只会被调用一次。

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

我不使用1.4,但1.3中的源代码显示File通过getModelObject()的{​​{1}}方法检索onClick()

Link

DownloadLink.onClick()

的源代码
IModel fileModel = new AbstractReadOnlyModel(){
    public Object getObject() { 
        return generateFile();
    }
};

DownloadLink link = new DownloadLink(linkId, fileModel, "report.pdf");

答案 1 :(得分:11)

请改用org.apache.wicket.markup.html.link.ResourceLink。