2011-10-04 27 views
18

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,如果它的確與衆不同。)

回答

15

你就不能使用,需要一個Model作爲參數的構造?並使Model在其getObject()中生成File。 A LoadableDetachableModel是一個不錯的選擇,因爲load(),因此文件生成將只被調用一次。

如果每次點擊鏈接時都要重新生成文件,請使用DownloadLink.setDeleteAfterDownload(true)以確保文件在服務後自動刪除。

我不使用1.4,但在1.3的源代碼顯示,File通過在LinkonClick()方法的getModelObject()裝置檢索。 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 */...); 
} 
+2

您也可以覆蓋DownloadLink的onclick和()'調用父類方法之前做了'setModelObject。不過,哈維的建議更清晰。 – jbrookover

+4

1.使用'LoadableDetachableModel'代替。 'getObject()'可能在請求期間被多次調用,但'load()'不會; 2.如果文件總是被重新生成,你可以調用'downloadLink.setDeleteAfterDownload(true)',這樣你就不用擔心之後刪除臨時文件了。 – tetsuo

+0

@tetsuo感謝您的寶貴意見。我已經用你的建議更新了答案。 –

10

使用org.apache.wicket.markup.html.link.ResourceLink的

IModel fileModel = new AbstractReadOnlyModel(){ 
    public Object getObject() { 
     return generateFile(); 
    } 
}; 

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

的源代碼來代替。

+0

什麼是使用ResourceLink代替DownloadLink(作爲[哈維洛佩茲示出](http://stackoverflow.com/questions/7646270/using-wickets-downloadlink-so-that-the-file-is-generated-益處當最鏈路是-clicke/7646332#7646332))?(不確定它是否相關,但請注意,此處下載的文件不是靜態資源,而是始終重新生成的動態報告。) – Jonik

+0

DownloadLink適用於java.io.File,ResourceLink適用於IResource。有幾種IResource實現與Wicket發行版一起提供,其中大部分都生成動態數據。 –

相關問題