2015-11-04 95 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()); 
     } 
    } 

}