【问题标题】:Primefaces extensions documentViewer show download statusPrimefaces 扩展 documentViewer 显示下载状态
【发布时间】:2016-02-04 23:24:05
【问题描述】:

我使用 primefaces 扩展 documentViewer 来显示 pdf。文件是流式传输的,这意味着支持 bean 提供了一个 org.primefaces.model.DefaultStreamedContent 的实例。如果显示一个大的 pdf,则查看器需要一些时间才能显示某些内容。在 PF 扩展网站的展示中,documentViewer 在查看器按钮栏下方显示了一个加载栏。不幸的是,这在我的案例中没有显示。在陈列柜中没有使用DefaultStreamContent。它是文件的 url。也许我必须设置流媒体内容的总大小? DefaultStreamedContent 有可能吗?

【问题讨论】:

  • “也许我必须设置流媒体内容的总大小?” 是的!在response.setContentLength(contentLength) 的味道。然后客户端可以计算进度。
  • 好的,还没有考虑过。不幸的是,我无法验证它,因为我发现我们的后端模型无法提供可靠的尺寸。如果大小设置得太大,查看器会显示 PDFException。
  • 它必须是准确的大小(即字节数)。您的意思是说您的 PDF 是根据任意数据动态自动生成的,因此不会(临时)静态存储在某些数据存储中?
  • 由于加密问题导致尺寸错误。

标签: jsf-2 primefaces jsf-2.2 primefaces-extensions


【解决方案1】:

也许我必须设置流媒体内容的总大小

是的!只有事先知道响应内容长度,客户端才能计算进度。在JSF中,可以通过ExternalContext#setResponseContentLength()设置响应内容长度。

如果您想返回 StreamedContent,以下是您可以做到的方法(基于 a.o. 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());
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2012-06-02
    • 2016-12-21
    相关资源
    最近更新 更多