Как связать динамический контент с помощью ‹p:media›?

Я использую <p:media> для отображения статического содержимого PDF.

<p:media value="/resource/test.pdf" 
         width="100%" height="300px" player="pdf">  
</p:media>

Как я могу изменить его для отображения динамического содержимого?


person Venkat Maridu    schedule 09.01.2013    source источник


Ответы (1)


Как и в <p:graphicImage>, атрибут value может указывать на свойство компонента, возвращающее StreamedContent. Для этого требуется только специальный метод получения по причинам, которые подробно объясняются в следующем ответе об использовании <p:graphicImage> с динамическим ресурсом из базы данных: Отобразить динамическое изображение из базы данных с p:graphicImage и StreamedContent.

В вашем конкретном примере это будет выглядеть так:

<p:media value="#{mediaManager.stream}" width="100%" height="300px" player="pdf">
    <f:param name="id" value="#{bean.mediaId}" />
</p:media>

С участием

@ManagedBean
@ApplicationScoped
public class MediaManager {

    @EJB
    private MediaService service;

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

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {
            // So, browser is requesting the media. Return a real StreamedContent with the media bytes.
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            Media media = service.find(Long.valueOf(id));
            return new DefaultStreamedContent(new ByteArrayInputStream(media.getBytes()));
        }
    }

}
person BalusC    schedule 09.01.2013
comment
Что, если я оставлю свой ManagedBean в @ViewScoped? - person Kishor Prakash; 12.09.2013
comment
Это не удастся: stackoverflow.com/q/18994288 Всегда используйте bean-компонент без сохранения состояния с <f:param> для обслуживания StreamedContent. - person BalusC; 17.10.2019