2017-12-16 37 views
0

내 Oracle 데이터베이스에 blob으로 저장된 PDF 파일을보고 싶습니다. xhml<p:media/>을 사용하고 있고, 뒷받침 빈에 StreamedContent을 사용하고 있습니다. 여기Primfaces에서 p : media를 사용하여 Pdf 표시

xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:p="http://primefaces.org/ui"> 

<p:outputPanel id="outputPanelDialogShowPdf"> 

    <div style="text-align: center"> 
     <p:media value="#{bean.media}" width="600px" height="300px" player="pdf" /> 
    </div> 

    <p:spacer height="1px" /> 
    <div style="text-align: center"> 
     <p:commandButton value="#{msgs.button_cancel}" icon="ui-icon-cancel" oncomplete="dialogShowPdf.hide();" 
         action="#{bean[cancelAction]}" immediate="true" /> 
    </div> 
</p:outputPanel> 

입니다 그리고 여기에 액션 콩

<p:commandButton value="Show PDF" 
           update=":formMediaDataDialogShowPdf:outputPanelDialogShowPdf" 
           oncomplete="PF('dialogShowPdf').show()" 
           action="#{ bean.showPdfAction }" rendered="#{ mediaData.mediaType == 'application/pdf'}"> 
       <f:setPropertyActionListener value="#{mediaData}" target="#{bean.selectedMediaData}" /> 
      </p:commandButton> 

에게 호출 (데이터 테이블의 일부) 액션 버튼입니다 그리고 이것은의 작업입니다 콩

public void showPdfAction(){ 

    if (null != selectedMediaData) { 
     media = new DefaultStreamedContent(new ByteArrayInputStream(selectedMediaData.getMediaData()),"application/pdf"); 
    } 
} 

문제는 빈의 작업이 오류없이 실행되고 빈의 media 속성이 제대로 초기화되어 있어도 미디어가 표시되지 않는 것입니다.

사람이 연구의 몇 시간 후 그

+0

@kukeltje 코드를 지연시키는 생각이 있습니까? –

+0

예, 읽어 봤지만, 제가 묻는 것과 관련이 있습니까? 그냥 물어 보는 건데. –

+0

Thanks @Kukeltje .. 질문을 업데이트했습니다. –

답변

0

에 대한 도움을 제공 할 수 있습니다, 나는 저와 아주 잘 작동 해결책을 발견했다. 내가 세션 속성으로 pdfBytesArray을 전달하고있어, 나는 내가 다음 세션에서이 속성을 얻을 수있는 서블릿을 만든 지금

if (null != selectedMediaData) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 

    session.setAttribute("pdfBytesArray", selectedMediaData.getMediaData()); 
} 

을 다음과 같이

나는 빈에서 작업을 업데이트 한 application/pdf

public class PdfPreviewServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    byte[] pdfBytesArray = (byte[]) request.getSession().getAttribute("pdfBytesArray"); 
    request.getSession().removeAttribute("pdfBytesArray"); 
    response.setContentType("application/pdf"); 
    response.setContentLength(pdfBytesArray.length); 
    response.getOutputStream().write(pdfBytesArray); 
} } 

의 컨텐츠 유형에 응답 스트림에 쓰기 다음 바이트 배열 프로세스는 @WebServlet("/pdfPreviewServlet")

와 서블릿 주석

다음 변경됨 <p:media/><p:media value="/pdfPreviewServlet" player="pdf"/>