2013-08-13 11 views
5

Per utilizzare la lightbox, ho bisogno di un collegamento all'immagine come generata da <p:graphicImage>.Ottieni l'URL concreto di <p: graphicImage> restituendo StreamedContent

In ultima analisi, il codice HTML dovrebbe essere così:

<a href="image.jpg" data-lightbox="bilder"> 
    <img src="image.jpg" /> 
</a> 

Questo è il mio tentativo JSF finora:

<h:outputLink data-lightbox="bilder" value="???"> 
    <p:graphicImage value="#{imageStreamer.image}"> 
    <f:param name="imageId" value="#{gameReader.game.cover.id}"/> 
    </p:graphicImage> 
</h:outputLink> 

Come faccio a ottenere l'URL concreta di <p:graphicImage> tornare StreamedContent in modo che io possa usarlo nel mio link?

+4

Buona domanda. Come soluzione rapida e rapida, puoi facilmente utilizzare JS per questo. A proposito, PrimeFaces ha già un componente '' fuori dalla scatola. Non è necessario utilizzare una libreria di terze parti per questo. – BalusC

risposta

1

Questa avere un'unica soluzione - utilizza servlet: ecco un servlet che funzionerà in qualsiasi applicazione JSF

package com.dossier.web.handlers; 

//~--- non-JDK imports -------------------------------------------------------- 



import com.dossier.backend.services.mongo.FileService; 
import com.mongodb.gridfs.GridFSDBFile; 

//~--- JDK imports ------------------------------------------------------------ 

import java.io.*; 

import javax.faces.context.FacesContext; 
import javax.servlet.ServletException; 
import javax.servlet.SingleThreadModel; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.io.IOUtils; 

/** 
* 
* @author Armen Arzumanyan 
*/ 
@WebServlet(urlPatterns = { "/PreviewImage" }) 
public class PreviewImage extends HttpServlet implements SingleThreadModel { 
    private static final long serialVersionUID = -6624464650990859671L; 
    private FileService  fileAction  = new FileService(); 

    @Override 
    public void init() throws ServletException { 
     super.init(); 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     doPreviewImage(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {} 

    private void doPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     String  fileIdStr = request.getParameter("fileId"); 
     String  widthStr = request.getParameter("w"); 
     GridFSDBFile file  = null; 
     int   width  = 0; 

     if ((widthStr != null) && (widthStr.length() > 0)) { 
      try { 
       width = Integer.parseInt(widthStr); 
      } catch (NumberFormatException e) {} 
     } 

     if (fileIdStr != null) { 
      if (fileAction != null) { 
       file = fileAction.getFile(fileIdStr.trim()); 
      } 

      if (file != null) { 
       byte[] content = IOUtils.toByteArray(file.getInputStream()); 

       if (content != null) { 
        String mimeType = file.getContentType(); 

        response.addHeader("Pragma", "cache"); 
        response.addHeader("Cache-Control", "max-age=3600, must-revalidate"); 
        response.addDateHeader("Expires", System.currentTimeMillis() + 1000 * 3600 * 10); 
        response.setContentType(mimeType); 

        try { 
         if (((mimeType != null) 
           && (mimeType.equalsIgnoreCase("image/gif") || mimeType.equalsIgnoreCase("image/x-png") 
            || mimeType.equalsIgnoreCase("image/png") || mimeType.equalsIgnoreCase("image/jpg") 
            || mimeType.equalsIgnoreCase("image/jpeg"))) || (width == 0)) { 
          response.getOutputStream().write(content); 
         } else { 

//       ByteArrayInputStream bi = new ByteArrayInputStream(content); 
//       InputStream thumbStream = scaleImageJPG(bi, width); 
//       byte[] thumbContent = new byte[thumbStream.available()]; 
//       thumbStream.read(thumbContent); 
          response.getOutputStream().write(content); 
         } 
        } catch (IOException e) { 

         // log.error("file content send error"); 
         e.printStackTrace(); 
        } catch (Exception e) { 

         // log.error("file exception: " + e); 
         e.printStackTrace(); 
        } finally { 
         content = null; 
         file = null; 
        } 

        return; 
       } 
      } else { 

       // TODO add page not found 
       response.addHeader("Pragma", "no-cache"); 
       response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600); 

       try { 
        response.getWriter().println("file object is null"); 
       } catch (Exception e) {} 

       return; 
      } 
     } 

     // TODO add page not found 
     response.addHeader("Pragma", "no-cache"); 
     response.addDateHeader("Expires", System.currentTimeMillis() - 1000 * 3600); 

     try { 
      response.getWriter().println("file id is not set"); 
     } catch (Exception e) {} 

     // log.debug("file ID parameter is not set or file is not found"); 
     return; 
    } 

    // </editor-fold> 
} 


//~ Formatted by Jindent --- http://www.jindent.com 

Ed ecco un codice della pagina web

<h:graphicImage id="primage" styleClass="img-rounded img-responsive" 
                   url="/PreviewImage?w=250&amp;fileId=#{updatePersonBean.person.imageId}" 
                   width="250" rendered="#{updatePersonBean.person.imageId != null}"/>            
               <h:graphicImage id="primagenew" styleClass="img-rounded img-responsive" 
                   url="/resources/img/userpic_simple.gif" 
                   width="250" rendered="#{updatePersonBean.person.imageId == null}"/> 

Godetevi

+0

Questa è una soluzione, ma stavo cercando qualcosa che non avrebbe bisogno di un servlet aggiuntivo. –

+0

Nessuna altra soluzione, nessuna altra soluzione sarà basata sul servlet, perché l'intero JSF basato anche sui servlet, anche qualsiasi applicazione web Java dovrebbe usare qualche tipo di servlet, questa soluzione che ho usato in molti progetti. :) –

Problemi correlati