2015-06-10 42 views
1

我試圖通過p:poll下載文件。這是可能的下載文件上:民意調查

這裏是我的代碼:

<p:commandButton id="sendMessage" value="sendMessage" actionListener="#{logsController.sendMessage}" /> 
<p:poll interval="3" async="false" immediate="true" listener="#{logsController.downloadAll(null)}" /> 

和支持bean:

public void sendMessage(ActionEvent event) { 
    {adding message to queue} 
} 

public void downloadAll(ActionEvent event) { 
    ... 
    if(readyToDownload) { 
     Faces.sendFile(logFile.getFileByteArray(), "file.txt", true); 
    } 
} 

我想開闢 「另存爲」 對話框,但我只得到JQuery的JSON解析錯誤。

我嘗試下載的內容是來自外部API的消息結果,所以我突然無法獲得該內容。

也許是另一種解決這個問題的方法嗎?

回答

4

沒有。您無法以整個文件附件作爲ajax響應進行響應。首先,jQuery會感到困惑,因爲它得到了一個文件附件,而不是預期的XML/JSON響應,並指示如何處理HTML DOM樹。其次,JavaScript有明顯的安全性原因,沒有設施強制將文件內容保存在任意JavaScript變量中進行對話。

在同步請求期間文件下載確實發生。正是這樣的要求,如<h:commandButton>,<p:commandButton ajax="false">window.location

最好的辦法是返回JavaScript指令來調用同步請求。例如。

if (readyToDownload) { 
    RequestContext.getCurrentInstance().execute("document.getElementById('form:download').click();"); 
} 
<h:form id="form"> 
    <p:commandButton id="download" styleClass="ui-helper-hidden" 
     action="#{logsController.downloadFile}" ajax="false" /> 
</h:form> 

,然後實際在downloadFile()方法發送文件。

+0

它適合我,謝謝。 – mariuszs80

+0

不客氣。 – BalusC