如何将 Wicket 的下载链接与动态生成的文件一起使用?



DownloadLink对于创建用于下载文件的按钮/链接非常方便,如下所示:

add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));

<input type="button" wicket:id="downloadButton" value="Download" />

但是,我希望仅在单击按钮/链接时触发文件的生成以下载。换句话说,在单击时,我将调用一个方法来生成文件(在我们的示例中是Pentaho报告),将其放在临时位置并返回指向它的File。然后我告诉DownloadLinkFile。问题是,这可能吗?

目前我们有类似下面的代码,它的工作,但我感兴趣的是是否可以使用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是通过LinkonClick()方法中的getModelObject()来检索的。

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。

最新更新