2015-11-04 6 views
2

Я использую расширения facfaces documentViewer для показа pdf-файлов. Файлы передаются потоком, это означает, что бэк-компонент предоставляет экземпляр org.primefaces.model.DefaultStreamedContent. Если показан большой PDF-файл, потребовалось некоторое время, пока зритель ничего не покажет. В витрине веб-сайта расширений PF documentViewer показывает панель загрузки под панелью кнопок зрителей. К сожалению, это не показано в моем случае. В витрине нет DefaultStreamContent. Это url для файла. Может быть, мне нужно установить общий размер потокового контента? Возможно ли это с DefaultStreamedContent?Основные интерфейсы documentViewer показать статус загрузки

+1

* «? Может быть, я должен установить общий размер для поточного содержания» * Да ! В аромате 'response.setContentLength (contentLength)'. Затем клиент может вычислить прогресс. – BalusC

+0

Хорошо, не думал об этом. К сожалению, я не могу это проверить, потому что я понял, что наша бэкэнд-модель не обеспечивает надежный размер. Если размер слишком большой, зритель показывает исключение PDFException. – opfau

+0

Это должен быть точный размер (т. Е. Количество байтов). Вы хотите сказать, что ваши PDF-файлы автоматически генерируются автоматически на основе произвольных данных и, таким образом, не (временно) статически сохраняются в каком-либо хранилище данных? – BalusC

ответ

2

Может быть, я должен установить общий размер для поточного содержания

Да! Клиент может вычислить только прогресс, если длина содержимого ответа известна заранее. В JSF вы можете установить длину содержимого ответа через ExternalContext#setResponseContentLength().

При условии, что вы хотите вернуть StreamedContent, вот как вы можете это сделать (на основе ао 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()); 
     } 
    } 

} 
Смежные вопросы