2015-11-04 51 views
2

我使用primefaces擴展documentViewer來顯示pdf。這些文件是流式傳輸的,這意味着後臺bean提供了一個org.primefaces.model.DefaultStreamedContent的實例。如果顯示一個大的pdf文件,直到觀看者顯示一些內容需要一些時間。在PF擴展網站的展示中,documentViewer在查看器按鈕欄下方顯示一個加載欄。不幸的是,這並沒有顯示在我的情況。在陳列櫃中沒有使用DefaultStreamContent。這是要歸檔的網址。也許我必須設置流媒體內容的總大小?這可能與DefaultStreamedContentPrimefaces擴展documentViewer顯示下載狀態

+1

*?「也許我必須設置總規模的流媒體內容」 *是!在'response.setContentLength(contentLength)'的味道。然後客戶可以計算進度。 – BalusC

+0

好吧,沒有想過這個。遺憾的是我無法驗證它,因爲我發現我們的後端模型不能提供可靠的尺寸。如果大小設置得太大,查看器將顯示PDFException。 – opfau

+0

它必須是確切的大小(即字節數量)。你的意思是說你的PDF是基於任意數據自動生成的,因此不會(暫時)靜態存儲在某些數據存儲中? – BalusC

回答

2

也許我必須設置總規模的流媒體內容

是的!如果事先知道響應內容的長度,客戶端只能計算進度。在JSF中,您可以通過ExternalContext#setResponseContentLength()設置響應內容長度。

前提是你要返回StreamedContent,這裏是你如何能做到這一點(基於AO Display dynamic image from database with p:graphicImage and StreamedContent):

@ManagedBean 
@ApplicationScoped 
public class PdfManager { 

    @EJB 
    private PdfService service; 

    public StreamedContent getContent() throws IOException { 
     FacesContext context = FacesContext.getCurrentInstance(); 

     if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      return new DefaultStreamedContent(); 
     } else { 
      Pdf pdf = service.generateItSomehow(); 
      context.getExternalContext().setResponseContentLength(pdf.getLength()); 
      return new DefaultStreamedContent(pdf.getInputStream()); 
     } 
    } 

}