2013-03-29 101 views
2

我有一個提交按鈕的面板。 onsubmit,我想寫一些文本到文件並提供文件下載給用戶。不知道該怎麼去做。如果有人能指向一個真正有幫助的鏈接或代碼檢票提供文件下載

+3

看看這篇文章[如何使用Wicket的DownloadLink與在飛行中生成的文件](http://stackoverflow.com/questions/7646270/how-to-use-wickets-downloadlink-with-a-文件生成的飛行) – mvlupan

+0

[下載鏈接](http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/html/link/DownloadLink.html) – TOUDIdel

回答

0

這並不容易。我使用了下載鏈接,但沒有一個表單變量被下載鏈接使用,因爲點擊下載鏈接不會提交表單。它只是使用初始值。我必須使用ajax onchange事件來更新表示表單組件的實例變量,然後使用下載鏈接根據用戶輸入創建文件。

0

如在entry on the Wicket wiki中詳細描述的,您需要創建一個行爲來構建您的文件,然後通過提交鏈接觸發該文件。這將確保在您創建文件之前使用模型更新完成。

創建從資源流的請求行爲實現:

public abstract class AJAXDownload extends AbstractAjaxBehavior 
{ 
    private boolean addAntiCache; 

    public AJAXDownload() { 
     this(true); 
    } 

    public AJAXDownload(boolean addAntiCache) { 
     super(); 
     this.addAntiCache = addAntiCache; 
    } 

    /** 
    * Call this method to initiate the download. 
    */ 
    public void initiate(AjaxRequestTarget target) 
    { 
     String url = getCallbackUrl().toString(); 

     if (addAntiCache) { 
      url = url + (url.contains("?") ? "&" : "?"); 
      url = url + "antiCache=" + System.currentTimeMillis(); 
     } 

     // the timeout is needed to let Wicket release the channel 
     target.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);"); 
    } 

    public void onRequest() 
    { 
     ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(getResourceStream(),getFileName()); 
     handler.setContentDisposition(ContentDisposition.ATTACHMENT); 
     getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler); 
    } 

    /** 
    * Override this method for a file name which will let the browser prompt with a save/open dialog. 
    * @see ResourceStreamRequestTarget#getFileName() 
    */ 
    protected String getFileName() 
    { 
     return null; 
    } 

    /** 
    * Hook method providing the actual resource stream. 
    */ 
    protected abstract IResourceStream getResourceStream(); 
} 

的(提交)鏈接和行爲的實現:

final AJAXDownload download = new AJAXDownload() 
{ 
    @Override 
    protected IResourceStream getResourceStream() 
    { 
     return createResourceStream(item.getModelObject()); 
    } 
}; 
item.add(download); 

item.add(new AjaxSubmitLink("link") { 
    @Override 
    public void onSubmit(AjaxRequestTarget target, Form<?> form) 
    { 
     // do whatever with the target, e.g. refresh components 
     target.add(...); 

     // finally initiate the download 
     download.initiate(target); 
    } 
}); 

@magomi創建了一個類似的實現響應this問題。

+0

感謝您張貼您的回答!請注意,您應該在此處發佈答案的重要部分,在此網站上,或者您的帖子風險被刪除[請參閱常見問題,其中提到的答案几乎不超過鏈接。](http:// stackoverflow。 com/faq#deletion)如果您願意,您可能仍然包含該鏈接,但僅作爲「參考」。答案應該獨立,不需要鏈接。 – Taryn

+0

@bluefeet - 道歉,更正。 – Jim